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

本文关键字:类型 什么 我应该 | 更新日期: 2023-09-27 18:18:48

我有大约10,000条记录。每条记录有2个字段:一个字段是长度不超过300个字符的字符串,另一个字段是十进制值。这就像一个产品目录,上面有产品名称和每种产品的价格。

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

  1. 哪种类型的收集最适合此场景?
  2. 如果我需要根据产品名称或价格进行排序,选择仍然相同吗?

现在我正在使用XML文件,但我认为使用集合以便我可以在代码中嵌入所有值更简单。谢谢你的建议。

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

字典就可以了。然而,如果你正在做快速部分匹配(例如搜索用户类型),你可以通过创建指向同一项的多个键来获得更好的性能。例如,"Apple"一词可以用"Ap"、"App"、"Apple"answers"Apple"来定位。

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

如果需要,您还可以创建自己的键来重定向常见拼写错误或指向相关项。这也消除了唯一键的大多数问题,因为每个键指向一个列表。单个物品可以按其名称中的每个词进行分类;如果您的产品名称很长且包含多个单词,这将非常有用。在对项目进行分类时,名称中的每个单词可以映射到一个或多个键。

我还应该指出,如果正确的话,构建和分类10K个道具应该不会花费很长时间(几百毫秒是合理的)。使用ApplicationCache或静态成员,结果可以缓存多久就缓存多久。

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

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

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

上述结构提供的功能应该大致相当于一个树。

10K条记录不算多。

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

假设产品名称是唯一的