Какое выражение LINQ лучше? - PullRequest
4 голосов
/ 22 сентября 2011

Мне было интересно, какое из следующих выражений LINQ лучше (особенно с точки зрения производительности).

Примечания:

  • длина SearchKeywords обычнооколо 50
  • длина ключевых слов обычно составляет около 3
  • этот метод вызывается около 100 000 раз

этот?

keywords.All(a => SearchKeywords.Contains(a));

или этот

keywords.Except(SearchKeywords).None();

Примечание: .None () - это мой метод расширения, который просто возвращает! .Any ()

Есть ли лучший способ написать это?

С уважением

Ответы [ 3 ]

8 голосов
/ 22 сентября 2011

Except будет примерно в миллиард раз быстрее, потому что он использует хеш-таблицу для определения разницы набора ¹ и, следовательно, даст производительность O (n).

Комбинация Contains / All будет иметьвыполнить наивный линейный поиск ² свыше SearchKeywords для каждого элемента в keywords, поэтому мы говорим о производительности O (n²) (на самом деле n * m, но числа, которые вы даете, находятся в том же диапазоне и используют любое оправдание, которое я могувведите показатели).

Обновление: , как и ожидалось, это даже не близко , если вы явно не создадите HashSet.


nUnlessконечно, SearchKeywords уже равен a HashSet<string>, поскольку flq очень правильно указывает в комментарии.

«По крайней мере, если мы говорим о IEnumerable, который используетLINQ для объектов стандартной реализации.IQueryable теоретически может обнаружить это и реализовать его любым удобным для него способом.

1 голос
/ 22 сентября 2011

Не уверен, но я думаю

keywords.Except(SearchKeywords).None(); 

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

0 голосов
/ 22 сентября 2011

Первый вариант гораздо удобнее для чтения и совместим с LINQ to SQL, если SearchWords является локальной коллекцией

Второй вариант несовместим с Linq To SQL.

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