2010-03-24 3 views
9

При написании метода цепи для LINQ, я могу сделать то Где заявления один из двух способов:Linq Where Clauses - Лучше складывать или комбинировать?

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

Или

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

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

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

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

+0

Когда вы спрашиваете о преимуществах, вы имеете в виду производительность, читаемость или что-то еще? – Kane

+0

Любые преимущества, кроме удобочитаемости, поскольку оба они достаточно читаемы в моем POV – Dann

ответ

3

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

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

+0

Я не знал, что LINQ работает так (хотя сейчас это имеет смысл). Я думал, что первый из них будет самым быстрым из-за комбинированного сравнения. Счастлив, я положил этот Q сейчас. – Dann

0

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

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

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

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

+2

Не могли бы вы объяснить, почему поставить более дешевое сравнение в конце, а не на фронт? Я бы сделал это наоборот, но только по инстинкту, не по каким-то веским причинам. =) – Jens

+1

Я написал небольшое тестовое приложение, которое подтверждает мой инстинкт здесь (два, где клаузулы, один из которых берет короткий Thread.Sleep, другой - быстрый). Каждый раз, когда вызов, кажется, выполняется по результату предыдущего, так что более дешевые сравнения должны быть первыми. Я сделал ошибку? – Jens

+0

Дженс прав, ваше заявление обратное. Я просто протестировал его так же, как метод, который разрешает консоль при его ударе, и методы выполняются последовательно, слева направо – Dann

Смежные вопросы