我应该使用哪种集合类型?

7
我大约有10,000条记录。每个记录都有两个字段:一个字段是长度最多为300个字符的字符串,另一个字段是十进制值。这就像一个产品目录,其中包含产品名称和每个产品的价格。
我需要做的是允许用户键入任何单词,并在列表框中显示包含该单词的所有产品及其价格。就是这样。
1. 在这种情况下,哪种类型的集合最好? 2. 如果我需要根据产品名称或价格进行排序,选择还是一样吗?
现在我正在使用XML文件,但我认为使用集合可以将所有值嵌入代码中更简单。感谢您的建议。

请不要在标题中加入C#,这是标签的作用。 - user47589
非集合:您可以使用SQLLite存储数据并访问它。 - Felix K.
2个回答

10
一本字典就可以完成任务。然而,如果你要进行快速的部分匹配(例如,当用户输入搜索时),可以通过创建多个指向同一项的键来提高性能。例如,单词“苹果”可以用“Ap”、“App”、“Appl”和“Apple”定位。
我在类似数量的记录上使用了这种方法,并取得了非常好的效果。我将我的10,000个源项转换为大约50,000个唯一的键。每个这些字典条目都指向一个包含对所有匹配项的引用的列表。然后,您可以更有效地搜索这个更小的列表。尽管会创建大量的列表,但内存占用量相当合理。
如果需要,您还可以自己创建键以重定向常见的拼写错误或指向相关的项。这也消除了唯一键的大多数问题,因为每个键都指向一个列表。一个单独的项目可能会被其名称中的每个单词分类;如果您的产品名称很长且有多个单词,则这非常有用。在对项目进行分类时,名称中的每个单词都可以映射到一个或多个键。
我还应该指出,如果正确执行,构建和分类10,000个项目不应该花费太长时间(几百毫秒是合理的)。可以使用Application、Cache或静态成员缓存结果,时间可以长达您想要的任何时间。
总之,得到的结构是一个Dictionary<string, List<T>>,其中字符串是短的(2-6个字符效果良好),但唯一的键。每个键都指向与该键匹配的List<T>(或其他集合,如果您愿意)项。进行搜索时,您需要定位与用户提供的术语匹配的键。根据键的长度,您可以将用户的搜索截断为最大键长度。在找到正确的子集合后,可以使用任何您希望使用的方法在该集合中进行完全或部分匹配的搜索。

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

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

前面提到的结构应该提供与trie大致相当的功能。


1
+1 建议使用 Product 类,展示了部分匹配的方法,并花时间编写了有用的答案。 - Adam

9

1万条记录并不算太多。

Dictionary<string,decimal> 可以满足需求。你可以使用LINQ按键或值进行排序,还可以进行搜索。

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


我同意,但我认为值得指出的是,它只有在所有字符串都是唯一的情况下才有效。 - madd0
+1 和何时应该停止使用 Dictionary<string,decimal> 或者何时它会变得太慢而无法有效? - Surjit Samra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接