如果我使用LINQ执行以下操作:
void DoSomeStuffWithHashSet()
{
HashSet<int> set = new HashSet<int>();
for (int i = 0; i < 100; ++i) set.Add(i);
if (Lookup(set, new Random().NextInt(200))
System.Console.WriteLine("Yey");
else
System.Console.WriteLine("Ney");
}
bool Lookup(IEnumerable<int> haystack, int needle)
{
// O(N) search or HashSet<int>.Contains()?
return Enumerable.Contains(collection, needle);
}
将Enumerable.Contains()
解析为HashSet
上的优化实施,或者无论输入如何都会执行简单搜索?
答案 0 :(得分:6)
是的,它将使用HashSet<T>.Contains
。 HashSet<T>
根据documentation for Enumerable.Contains
实施ICollection<T>
:
如果源类型实现
ICollection<T>
,则调用该实现中的Contains
方法以获取结果。否则,此方法确定source是否包含指定的元素。
始终,始终,始终检查文档!
答案 1 :(得分:2)
是的,确实如此 - 在某些情况下。 Not 总是在您认为可能的时候。
作为编写Edulinq的一部分,我写了两篇关于优化的帖子(part 40; part 42)。基本上什么算作有效的优化并不总是显而易见的 - 但肯定有很多情况下LINQ to Object根据集合的执行时类型进行优化。对于返回单个值而不是序列的方法, 主要是。
答案 2 :(得分:0)
调用IEqualityComparer<T>
,最终调用Object.Equals
,HashSet
本身使用{{1}}