我需要一个字符串列表,并且需要一种快速确定一个字符串是否在该列表中的方法。
为了增强查找速度,我考虑使用SortedList
和Dictionary
;但是,这两个都需要使用KeyValuePair
,而我只需要单个的string
。
我知道我可以使用KeyValuePair
,并简单地忽略Value
部分。但是,我更喜欢高效率,只是想知道是否有一种集合更适合我的要求。
我需要一个字符串列表,并且需要一种快速确定一个字符串是否在该列表中的方法。
为了增强查找速度,我考虑使用SortedList
和Dictionary
;但是,这两个都需要使用KeyValuePair
,而我只需要单个的string
。
我知道我可以使用KeyValuePair
,并简单地忽略Value
部分。但是,我更喜欢高效率,只是想知道是否有一种集合更适合我的要求。
HashSet<String>
。Dictionary<string, byte>
(或任何你想要的TValue
类型参数)比SortedList
更快,如果有很多条目-后者将使用二进制搜索,因此它将是O(log n)查找,而不是O(1)。HashSet<string>
。我知道这个问题非常老,但是我必须解决同样的问题,只针对非常少量的字符串(在2到4之间)。
在我的情况下,我实际上使用了手动查找字符串数组的方法,这比HashSet<string>
要快得多(我进行了基准测试)。
for (int i = 0; i < this.propertiesToIgnore.Length; i++)
{
if (this.propertiesToIgnore[i].Equals(propertyName))
{
return true;
}
}
HashSet<>
有一些开销。我只会建议在搜索较大的集合时使用它。顺便说一下,您的代码可以缩短为类似于 return PropertiesToIgnore.Any(p => p.Equals(propertyName))
的形式。 - Jonathan WoodArrayManualLoop: 6.018 ns
ArrayLinq: 59.171 ns
。Linq会破坏处理器缓存,所有可能的收益都会丧失。 - Artur Krajewski我知道这个答案来得有点晚,但是我们遇到了系统运行缓慢的问题。经过分析,我们发现由于数据结构的设计方式存在大量的字符串查找操作。
因此,我们进行了一些研究,发现了这些基准测试,进行了自己的测试,并现在已经切换到使用 SortedList。
if (sortedlist.ContainsKey(thekey))
{
//found it.
}
ISet<T>
),还有另一个选项SortedSet<T>
(在这种情况下也不是特别有用)。 - Jon Skeet