我应该使用什么类型的收藏?

时间:2011-12-24 08:08:40

标签: c# xml collections

我有大约10,000条记录。每个记录有2个字段:一个字段是长度最多300个字符的字符串,另一个字段是十进制值。这就像产品目录,其中包含产品名称和每种产品的价格。

我需要做的是允许用户键入任何单词并在列表框中显示包含该单词的所有产品及其价格。就是这样。

  1. 哪种类型的收藏最适合这种情况?
  2. 如果我需要根据产品名称或价格进行排序,选择是否仍然相同?
  3. 现在我正在使用XML文件,但我想使用一个集合,以便我可以在代码中嵌入所有值更简单。谢谢你的建议。

2 个答案:

答案 0 :(得分:10)

字典将完成这项工作。但是,如果您正在进行快速部分匹配(例如,搜索为用户类型),则可以通过创建指向同一项目的多个键来获得更好的性能。例如,单词“Apple”可以与“Ap”,“App”,“Appl”和“Apple”一起定位。

我在相似数量的记录中使用了这种方法,效果非常好。我将我的10K源项目变成了大约50K的唯一键。这些词典条目中的每一个都指向一个列表,其中包含对该术语的所有匹配的引用。然后,您可以更有效地搜索这个更小的列表。尽管创建了大量列表,但内存占用非常合理。

如果需要,您还可以自行修改常见的拼写错误或指向相关项目。这也消除了使用唯一键的大多数问题,因为每个键都指向列表。单个项目可以按其名称中的每个单词进行分类;如果您的产品名称中包含多个单词,则此功能非常有用。对项目进行分类时,名称中的每个单词都可以映射到一个或多个键。

我还应该指出,如果正确完成(几百毫秒是合理的),建立和分类10K项目不应该花费很长时间。只要您想使用ApplicationCache或静态成员,就可以缓存结果。

总结一下,得到的结构是Dictionary<string, List<T>>,其中字符串是短(2-6个字符效果很好)但是唯一键。每个键都指向与该键匹配的List<T>(或其他集合,如果您愿意的话)。执行搜索时,您将找到与用户提供的术语匹配的键。根据密钥的长度,您可能会将用户的搜索截断为最大密钥长度。找到正确的子集合后,您可以使用您希望的任何方法搜索该集合以进行完整或部分匹配。

最后,您可能希望为列表中的每个项目创建一个轻量级结构,以便您可以存储有关该项目的其他信息。例如,您可以创建一个小型Product类,用于存储产品的名称,价格,部门和受欢迎程度。这可以帮助您优化向用户显示的结果。

总而言之,您可以实时执行智能,详细,模糊的搜索。

上述结构应提供大致相当于trie的功能。

答案 1 :(得分:9)

10K记录并不多。

Dictionary<string,decimal>符合条款。您可以使用LINQ按键或按值排序,也可以进行搜索。

这假定产品名称是唯一的。