1

Hashset<string>C#中的这两个枚举之间有什么性能差异吗?

foreach(string value1 in Hashset1) {

}

for(int i = 0; i < Hashset1.Count; i++) {
    string _value1 = Hashset1.ElementAt(i);
}

是否有任何其他快速枚举(性能方面) a Hashset

4

2 回答 2

8

如果这很重要,您应该进行基准测试并亲自查看在您的场景中更快的解决方案是什么。

在这种情况下,第二个解决方案几乎可以保证速度较慢,因为 ElementAt 是一个 Enumerable 扩展方法。它具有 IList<T> 的优化路径,而 HashSet<T> 未实现该路径。因此它采用“正常”路径,即从您的 IEnumerable<T> 中枚举 N 个元素。

您可以自己弄清楚您的第二个解决方案具有 O(N^2) 复杂性,而第一个解决方案肯定是 O(N)。

HashSet还有其他快速枚举吗?不,我不这么认为。这就是 IEnumerable 的用途。但这对您来说还不够快吗?微基准测试毫无用处,如果您的表现受此约束,我会担心。

于 2013-06-18T23:01:35.980 回答
3

是的,两者之间存在巨大差异。

Enumerable.ElementAt(int)是一个 O(n) 操作,所以你的第二个是 O(n^2) 复杂性。

相反,通过枚举器枚举集合是 O(n) 操作。

于 2013-06-18T23:00:29.953 回答