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;
Очевидно, что второй в среднем намного быстрее. Производительность Any()
будет аналогичным (не то же самое, что, благодаря HashSet), второй сниппет, а Count()
будет аналогичен первому.
Без меня, начиная с моего профилировщика, не могли бы вы объяснить, почему? Кажется, что два цикла будут стоить меньше, чем счет? – laktak
См. Мое редактирование для объяснения :) –