LINQ是否会根据输入类型使用专用/优化版本的函数?

lar*_*moa 4 c# linq collections

如果我使用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);
}
Run Code Online (Sandbox Code Playgroud)

Enumerable.Contains()解析为优化的实现,HashSet或者无论输入如何都将执行简单的搜索?

jas*_*son 6

是的,它会使用HashSet<T>.Contains.HashSet<T>实现ICollection<T>和根据以下文档Enumerable.Contains:

如果源类型实现ICollection<T>,Contains则调用该实现中的方法以获取结果.否则,此方法确定source是否包含指定的元素.

总是,总是,总是检查文档!

  • 请注意,这意味着没有相等比较器的`Contains`与使用键类型的默认相等比较器调用`Contains`相同.这是一个令人困惑的API,IMO. (2认同)