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

Зачем использовать First вместо FirstOrDefault в LINQ?

Возможный дубликат:
Когда использовать. Сначала и когда использовать .FirstOrDefault с LINQ?

В чем смысл использования оператора First в LINQ, если вместо этого вы можете использовать оператор FirstOrDefault?

var q = results.First(); // Error if empty
4b9b3361

Ответ 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();
}

Ответ 2

Чтобы принудительно заставить исключение получить возвышение по сравнению с выполнением проверки null.

Ответ 3

Это то же самое обсуждение, что и Int32.Parse vs. Int32.TryParse. Первый исключает в случае отказа, последний возвращает false, и программа продолжает плавно...