Linq Where Clauses - лучше складывать или комбинировать? - PullRequest
9 голосов
/ 24 марта 2010

При написании цепочки методов для LINQ я могу сделать оператор Where одним из двух способов:

var blackOldCats = cats.Where(cat => cat.Age > 7 && cat.Colour == "noir" )

Или

var blackOldCats = cats.Where(cat => cat.Age > 7).Where(cat => cat.Colour == "noir" )

Есть ли какие-либо преимущества одного над другим?

Не беспокойтесь слишком сильно о типах данных в этом примере, но если есть проблемы с типами данных, то это тоже было бы полезно знать.

Очевидным является то, что объектна него уже ссылаются, поэтому применение двух свойств одновременно облегчает работу приложения, верно?

Ответы [ 2 ]

3 голосов
/ 24 марта 2010

В вашем примере они одинаковы и являются вопросом личных предпочтений. Из-за отложенного выполнения LINQ, коллекция будет повторяться только один раз.

Если вы хотите объединить выражения с помощью оператора или, вы можете использовать только первое.

0 голосов
/ 24 марта 2010

Первый будет немного быстрее, так как несколько снижает накладные расходы. Кроме того, они обрабатываются в основном таким же образом.

Одно заметное отличие состоит в том, что свойство Color сравнивается перед свойством Age во втором примере. Если вы хотите более дешевое сравнение, чем короткое замыкание и более дорогое (так что свойство Color сравнивается только для элементов, для которых Age сравнение истинно), вы должны поместить более дешевое в последний вызов Where :

var blackOldCats =
  cats
  .Where(cat => cat.Colour == "noir")
  .Where(cat => cat.Age > 7);

В этом случае нет большой разницы в стоимости сравнений, но если одно намного дороже другого, было бы полезно узнать, в каком порядке они оцениваются.

...