C#中Hashset<string>
的这两个枚举之间是否有任何性能差异?
foreach(string value1 in Hashset1) {
}
和
for(int i = 0; i < Hashset1.Count; i++) {
string _value1 = Hashset1.ElementAt(i);
}
Hashset
还有其他快速枚举(性能明智)吗?
答案 0 :(得分:7)
如果重要,您应该进行基准测试,亲眼看看您的方案中哪种解决方案更快。
在这种情况下,第二个解决方案几乎可以保证较慢,因为ElementAt是一个Enumerable扩展方法。它具有IList&lt; T&gt;的优化路径,其中HashSet&lt; T&gt;没有实现。因此,它需要从您的IEnumerable&lt; T&gt;枚举N个元素的“正常”路径。
你可以自己弄清楚你的第二个解决方案是否具有O(N ^ 2)复杂度,而第一个解决方案肯定是O(N)。
还有其他快速枚举HashSet吗?不,我不这么认为。这就是IEnumerable的用途。但这对你来说不够快吗?微基准测试是没用的,我担心你的表现是否受此限制。
答案 1 :(得分:3)
是的,两者之间存在巨大差异。
Enumerable.ElementAt(int)
是一个O(n)操作,所以你的第二个操作具有O(n ^ 2)复杂度。
相反,通过枚举器枚举集合是O(n)操作。