【问题标题】:What type of collection should I use?我应该使用什么类型的集合?
【发布时间】:2013-02-22 14:21:00
【问题描述】:

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

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

  1. 哪种类型的集合最适合这种情况?
  2. 如果我需要根据产品名称或价格进行排序,选择是否仍然相同?

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

【问题讨论】:

  • 请不要将C#放在标题中。这就是标签的用途。
  • 不是一个集合:你可以使用 SQLLite 来存储和访问数据。

标签: c# xml collections


【解决方案1】:

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

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

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

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

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

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

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

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

【讨论】:

  • +1 用于建议产品类,展示部分匹配的方法并花时间写一个有用的答案
【解决方案2】:

10K 记录并不多。

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

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

【讨论】:

  • 我同意,但我认为值得指出的是,它只有在所有字符串都是唯一的情况下才有效。
  • +1 和任何我们应该停止使用 Dictionary 或当它太慢而无法生效的限制?
猜你喜欢
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2022-01-18
  • 2017-01-28
  • 1970-01-01
相关资源
最近更新 更多