如何按前缀对字符串进行分组

时间:2010-04-08 09:27:55

标签: grouping prefix names

我正在编写一个Winform UI,用户必须在其中选择一个客户。 (由于我无法控制的原因,我仅限于使用下拉列表,文本字段,复选框,无线电按钮的用户界面-i.e.没有花哨的特殊UI控件)

情况

  • 有很多客户(例如千人)
  • 如果我把所有客户都放在一个下拉列表中,那么客户就无法轻易看到所有客户。此外,退出所有客户从数据库填充下拉列表还需要很长时间
  • 我的想法是有两个组合框,第一个按姓氏列出客户群,如电话簿“Aa-Ac”,“Ad-Ade”,“Adf-B”,当选择第一个时组合框,它将第二个范围限定为可管理的集合客户名称(不超过例如40个名称)

问题

  • 我需要一种合理的方式对其名称进行分组,以便客户明白哪个组包含该名称。即给出一组名字我需要bucketize然后int“Aa-Ac”。

评论

  • 我不需要解决大量名称的一般问题 - 根据我们的数据,我们知道1000个名称是我们用户将遇到的最大名称。
  • 如果还有其他技术请分享,但我特别感兴趣的是我对如何确定水桶的具体问题的答案(“Aa-Ac”等)

3 个答案:

答案 0 :(得分:0)

其他技巧:
我将ComboBox和TextBox结合起来(这是你的文本域吗?或者你的意思是只读标签?),因此用户可以键入一些首字母,ComboBox将显示以这些字母开头的所有条目。在完全匹配的情况下,它甚至可以跳过ComboBox的使用并加快速度。

答案 1 :(得分:0)

Tanascious的建议主要是在正确的轨道上,但我不认为你没有两个组成部分。我做了任何C#开发已经有一段时间了,但是如果我没记错的话,单个组合框(listbox?)非常适合在数百个条目中进行选择,因为它支持按类型查找导航,即如果名称为用户正在寻找的是“Doe,John”,在选择组件时键入“do”将在几乎所有情况下将用户带入几个条目中,大部分时间用于确切的用户。在某个公共网页上,一切都需要点击咔嗒一声,这将不是最优的,但对于每天使用此界面工作的用户来说,通常没问题。

答案 2 :(得分:0)

我认为在确定gui应该如何工作之前你必须先思考一两次,但是如果你真的想要想出一些想法,那么你可以按照以下方式做点什么:

步骤1,创建存储桶:

  • 确定所需的铲斗尺寸(例如,假设为40)。
  • 对名称进行排序。
  • 将前40个名称作为第一个桶, 41-80命名第二个桶等,直到你创建了所有桶。

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

  • 让我们使用bucket [i] .Left来指代第i个桶名称的左侧部分(上面的“Adf”)和bucket [i]。右侧(“B”)
  • 让我们使用bucket [i] .Names来引用此存储桶中40个名称的列表
  • 现在假设我们有一个函数可以确定我们必须使用多少个字符来区分两个字符串(让我们称之为CharsNeeded),我们可以比较彼此相邻的桶的结尾/开头,并从中提取名称

像这样:

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-array上的索引超出范围。