Замена if (x) Foreach() с Foreach.Where(x)

Наверное, глупый вопрос, но у меня много:

if(X)
{
  foreach(var Y in myList.Where(z => z == 1)
  {
  }
} 

создает в некотором коде
Заменяет его на

foreach(var Y in myList.Where(z => X && z == 1) { }

безумен?

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

Ответы

Ответ 1

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

Вы должны придерживаться первой версии.

Ответ 2

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

Оптимизатор компилятора не сможет отменить ваш урон. Этот уровень оптимизации обычно возможен только на функциональных языках, поскольку для компилятора слишком сложно отслеживать возможные побочные эффекты.

Linq не имеет встроенных в него оптимизаций, которые находятся в любом месте, близком к тому, что вы ожидаете от перезаписывающего SQL-запроса в базе данных.

Ответ 3

Они не будут компилироваться с тем же кодом. Во второй версии X оценивается много раз, а myList перечислим. В худшем случае сценарий оценивает X что-то изменяет, и у вас есть непредсказуемая функциональность.