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

本文关键字:函数 专用 版本 优化 类型 是否 输入 LINQ | 更新日期: 2023-09-27 17:58:49

如果我用 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解析为优化实现,还是会执行简单的搜索而不考虑输入?

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

是的,它将使用 HashSet<T>.Contains . HashSet<T> 根据Enumerable.Contains的文档实现ICollection<T>

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

总是

,总是,总是检查文档!

是的,在某些情况下确实如此。并非总是在您认为它可能能够做到的时候。

作为编写 Edulinq 的一部分,我写了两篇关于优化的文章(第 40 部分;第 42 部分(。基本上,什么算作有效的优化并不总是显而易见的 - 但在很多情况下,LINQ to Object 会根据集合的执行时类型进行优化。这主要是返回单个值而不是序列的方法的情况。

它调用一个IEqualityComparer<T>,最终调用Object.Equals,而本身使用HashSet