Intersect
хорошо, но, как говорили другие, я бы не стал звонить .Count()
о результате.
Причина в том, что Intersect не создает пересечение двух списков. Он создает IEnumerable
, который способен из , перечисляя это пересечение, но фактически пока не перечисляет эти результаты. Большая часть работы откладывается до тех пор, пока вы, наконец, не выполните итерацию по этому перечислению.
Проблема с Count
заключается в том, что он выполняет итерацию по всему перечислению. Таким образом, он не только всегда учитывает все результаты, но и заставляет выполнять всю работу, связанную с вычислением этих результатов.
Вызов Any
вместо этого будет очень быстрым по сравнению, потому что вы вычислите не более один результат пересечения перед возвратом. Конечно, в случае отсутствия совпадений все равно потребуется выполнить итерацию всего списка. Тем не менее, это не хуже, чем вы были раньше. На самом деле, это все еще быстрее, потому что, как упоминал Джон Скит, функция Intersect
использует HashSet для вычисления результатов, а не итерации по всему. Ваши лучшие и средние дела значительно улучшились.
Это как разница между этими двумя фрагментами:
int count = 0;
foreach (int i in x)
{
foreach (int j in y)
{
if (i==j) count++;
}
}
return (count > 0);
.
// this one should look familiar
foreach (int i in x)
{
foreach (int j in y)
{
if (i==j) return true;
}
}
return false;
Очевидно, что 2-й намного быстрее в среднем. Производительность Any()
будет аналогичной (не то же самое, что благодаря HashSet) для второго фрагмента, тогда как Count()
будет аналогична первому.