Будет ли LINQ использовать специализированные / оптимизированные версии функций в зависимости от типа ввода? - PullRequest
4 голосов
/ 11 июня 2011

Если я сделаю что-то вроде следующего с 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 или будет выполняться простой поиск независимо от ввода?

Ответы [ 3 ]

6 голосов
/ 11 июня 2011

Да, будет использоваться HashSet<T>.Contains. HashSet<T> реализует ICollection<T> и согласно документации для Enumerable.Contains:

Если тип источника реализует ICollection<T>, метод Contains в этой реализации вызывается для получения результата. В противном случае этот метод определяет, содержит ли источник указанный элемент.

всегда, всегда, ВСЕГДА проверяйте документацию!

2 голосов
/ 11 июня 2011

Да, в некоторых случаях. Не всегда, когда вы думаете, что это возможно, хотя.

Как часть написания Edulinq, я написал два поста ( часть 40 ; часть 42 ) по оптимизации.По сути, то, что считается действительной оптимизацией, не всегда очевидно - но, безусловно, существует множество случаев, когда LINQ to Object оптимизирует в зависимости от типа времени выполнения коллекции.Это в основном в случае методов, возвращающих одно значение, а не последовательность.

0 голосов
/ 11 июня 2011

Он вызывает IEqualityComparer<T>, который в конечном итоге вызывает Object.Equals, который сам использует HashSet

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...