快速字符串查找的最佳集合

时间:2011-04-03 17:29:32

标签: c# .net collections

我需要一个字符串列表以及一种快速确定字符串是否包含在该列表中的方法。

为了提高查询速度,我考虑了SortedListDictionary;但是,当我只需要一个KeyValuePair时,两者都可以使用string

我知道我可以使用KeyValuePair而忽略Value部分。但我更喜欢高效,我只是想知道是否有更适合我要求的系列。

7 个答案:

答案 0 :(得分:32)

如果您使用的是.NET 3.5或更高版本,请使用HashSet<String>

如果失败,Dictionary<string, byte>(或TValue类型参数所需的任何类型)如果您有大量条目,则会比SortedList更快 - 后者将使用二进制搜索,所以它将是O(log n)查找,而不是O(1)。

答案 1 :(得分:10)

如果您只是想知道字符串是否在集合中,请使用HashSet<string>

答案 2 :(得分:5)

这听起来像是

的工作
 var keys = new HashSet<string>();

Per MSDN:Contains函数的复杂度为O(1)。

但是你应该知道,添加时它不会给重复项带来错误。

答案 3 :(得分:3)

HashSet<string>就像Dictionary,但只有键。

答案 4 :(得分:3)

我知道这个回答有点晚了,但我遇到了一个问题,我们的系统运行缓慢。在分析之后,我们发现有很多字符串查找与我们构建数据结构的方式一起发生。

所以我们做了一些研究,came across these benchmarks,做了我们自己的测试,现在切换到使用SortedList。

if (sortedlist.ContainsKey(thekey))
{   
//found it.
}

尽管字典被证明更快,但我们不得不重构代码,而且性能提升对我们来说已经足够了。

无论如何,想要分享网站以防其他人遇到类似的问题。他们在数据结构之间进行比较,其中您要查找的字符串是&#34;键&#34; (如HashTable,Dictionary等)或者&#34;值&#34; (列表,数组或字典等),这是我们存储的地方。

答案 5 :(得分:1)

如果您想要滚动自己的数据结构,请使用Trie。 http://en.wikipedia.org/wiki/Trie

最坏的情况是字符串是否存在:O(字符串的长度)

答案 6 :(得分:1)

我知道问题已经过时了,但我只需要解决同样的问题,只需要一小组字符串(2到4之间)。

在我的情况下,我实际上使用了一个字符串数组的手动查找,这些字符串变得比for (int i = 0; i < this.propertiesToIgnore.Length; i++) { if (this.propertiesToIgnore[i].Equals(propertyName)) { return true; } } 快得多(我对它进行了基准测试)。

for

请注意,它仅适用于微小数组的哈希设置!

编辑:仅适用于手动Single.flatMap(Function, BiFunction)循环,不使用LINQ,评论中的详细信息