【发布时间】:2010-11-12 07:04:23
【问题描述】:
我需要一种快速的方法来确定给定的字符串是否在字符串列表中。
字符串列表直到运行时才知道,但此后不会改变。
我可以简单地将List<String> 称为strings,然后这样做:
if (strings.Contains(item))
但是,如果列表中有很多字符串,这将表现不佳。
我也可以使用HashSet<String>,但这需要在每个传入字符串以及Equals 上调用GetHashCode,如果有例如,这将是一种浪费。列表中只有 3 个字符串。我有没有提到这需要快速?
我可以在设置时根据字符串的数量决定使用List 或HashSet(例如,少于10 个字符串使用List,否则使用HashSet),就像HybridDictionary 中的逻辑一样。
由于字符串是 unicode,标准的 Trie 结构将不起作用,尽管 Radix 树/Patricia trie 可能。有没有带有基准的好的 C# 实现?
有些人提到绕过String 的GetHashCode 并使用执行速度更快的哈希函数。是否有任何基准?
使用 LINQ 表达式本质上创建优化的 switch 语句是一种看起来非常有趣的新颖方法。
还有什么办法?设置成本并不重要,重要的是搜索速度。
如果重要的话,传入的字符串值将很少出现在列表中。
【问题讨论】:
-
我已经更新了我的答案,以包含指向 Unicode 折叠尝试信息的链接。