Ответ 1
Чтобы ответить прямо на ваш конкретный вопрос (зачем использовать First
, если вы всегда можете использовать FirstOrDefault
), бывают случаи, когда вы не можете использовать FirstOrDefault
, потому что он теряет информацию! "Значение по умолчанию", скорее всего, является допустимым типом элемента в списке источников. У вас нет возможности отличить первый элемент в перечислении от null/default по сравнению с отсутствием элементов в списке, если вы не используете First
или сначала проверяете, есть ли элементы Any
, для которых требуется двойное перечисление.
Это особенно верно для перечисляемых значений, таких как int[]
. default(int)
- 0
, что также, скорее всего, допустимое значение массива.
В общем, эти два метода представляют разные логические потоки. First
будет использоваться, если не есть какие-либо элементы "исключительные" (ошибка), которые затем хотят обрабатывать внеполосные приложения. В этом случае вы "ожидаете" иметь хотя бы один элемент. FirstOrDefault
возвращает null на пустой набор, что означает, что вам нужно выполнить дополнительную обработку с возвращенным значением. Это аналогичная логика методам Parse
vs TryParse
на int
/double
/etc. На самом деле ваш вопрос каким-то образом приводит к более общему вопросу о том, почему когда-либо использовать исключения.
Так как First
генерирует исключение, он предоставляет все возможности повторного использования кода, которые предоставляют исключения. Например, вы можете сделать:
try
{
x = arr1.First();
y = arr2.First();
z = arr3.First();
}
catch
{
throw new ArgumentException();
}