Подтвердить что ты не робот

С# Linq Где (выражение).FirstorDefault() vs .FirstOrDefault(выражение)

В чем разница между этими двумя запросами Linq:

var result = ResultLists().Where( c=> c.code == "abc").FirstOrDefault();
// vs.
var result = ResultLists().FirstOrDefault( c => c.code == "abc");
  • Семантика точно такая же?
  • Если и в том, что оно семантически совпадает, дает ли предикатная форма FirstOrDefault теоретическое или практическое преимущество в производительности по сравнению с Where() плюс простой FirstOrDefault()?
4b9b3361

Ответ 1

Либо отлично.

Они оба работают лениво - если в списке источников есть миллион элементов, но десятый элемент соответствует, то оба будут перебирать только 10 элементов из источника.

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

Ответ 2

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

Ответ 3

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

Where выглядит примерно так и возвращает новый IEnumerable

foreach (var item in enumerable)
{
    if (condition)
    {
        yield return item;
    }
}

FirstOrDefault() возвращает <T> и не выдает никакого исключения или возвращает ноль, если нет результата