代码之家  ›  专栏  ›  技术社区  ›  namenlos

如何按前缀对字符串分组

  •  1
  • namenlos  · 技术社区  · 15 年前

    形势

    • 如果我把所有的顾客都放在一个下拉列表中,顾客就很难看到所有的顾客。同时,要让数据库中的所有客户都退役来填充下拉列表也需要很长时间
    • 我的想法是有两个组合框,第一个按姓氏列出客户组,例如电话簿“a a Ac”、“Ad Ade”、“Adf-B”,当选择第一个组合框时,它将第二个组合框的范围限定为一个可管理的客户组名(例如不超过40个名称)

    问题

    • 我需要一个合理的方法来分组他们的名字,这样客户就可以清楚地知道哪个组包含这个名字。一、 给我一组名字,我需要把它们对折,然后输入“a a Ac”。

    评论

    • 我不需要解决大量名字的一般问题——根据我们的数据,我们知道用户最多会遇到1000个名字。
    • 如果有其他技巧,请分享,但我对如何确定桶(“Aa Ac”等)的具体问题的答案特别感兴趣
    3 回复  |  直到 15 年前
        1
  •  0
  •   tanascius    15 年前

    其他技术:

        2
  •  0
  •   Tomislav Nakic-Alfirevic    15 年前

    Tanascious的建议基本上是正确的,但我不认为你没有两个组成部分。我已经有一段时间没有做过任何C#开发了,但是如果我没记错的话,一个组合框(listbox?)很适合在数百个条目之间进行选择,因为它支持键入时查找导航,即,如果用户要查找的名称是“do e,John”,则在选择组件时键入“do”将在几乎所有情况下(大多数情况下)将用户带到几个条目内。在一个所有东西都需要点击的公共网页上,它可能不是最理想的,但是对于每天使用这个界面的用户来说,这通常是没有问题的。

        3
  •  0
  •   Jakob    15 年前

    步骤1,创建bucket:

    • 决定所需的桶大小(例如40)。
    • 让前40个名字成为第一个桶,

    步骤2,确定桶的“名称”(“Adf-B”等):

    • 让我们使用bucket[i].Left指的是第i个bucket名称(上面的“Adf”)和bucket[i].Right的左边部分(“B”)
    • 让我们使用bucket[i].Names来引用这个bucket中40个名称的列表

    这样地:

    bucket[i].Left = bucket[i].Names.First().Substring(0, CharsNeeded(bucket[i].Names.First(), bucket[i-1].Names.Last()));
    bucket[i].Right = bucket[i].Names.Last().Substring(0, CharsNeeded(bucket[i].Names.Last(), bucket[i+1].Names.First()));
    

    CharsNeeded可以这样实现,例如:

    int CharsNeeded(string str1, string str2)
    {
      int i=0;
      while (i < str1.Length && i < str2.Length && str1[i] == str2[i])
        i++;
      return i + 1;
    }
    

    另外,在边的情况下要小心,因为我没有检查bucket数组的索引是否越界。