С# 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()
?
Ответы
Ответ 1
Либо отлично.
Они оба работают лениво - если в списке источников есть миллион элементов, но десятый элемент соответствует, то оба будут перебирать только 10 элементов из источника.
Производительность должна быть почти одинаковой, и любая разница будет совершенно несущественной.
Ответ 2
Второй. При прочих равных условиях итератор во втором случае может остановиться, как только найдет совпадение, где первый должен найти все, что соответствует, а затем выбрать первый из них.
Ответ 3
Where
на самом деле является отложенным исполнением - это означает, что вычисление выражения задерживается до тех пор, пока фактически не потребуется его реализованное значение. Это значительно повышает производительность, избегая ненужного выполнения.
Where
выглядит примерно так и возвращает новый IEnumerable
foreach (var item in enumerable)
{
if (condition)
{
yield return item;
}
}
FirstOrDefault()
возвращает <T>
и не выдает никакого исключения или возвращает ноль, если нет результата