Когда использовать. Сначала и когда использовать .FirstOrDefault с LINQ?

Я обыскал и на самом деле не нашел четкого ответа о том, когда вы хотите использовать .First, и когда вы хотите использовать .FirstOrDefault с LINQ.

  • Когда вы хотите использовать .First? Только когда вы хотите поймать исключение, если не возвращены результаты?

    var result = List.Where(x => x == "foo").First();
    
  • И когда вы хотите использовать .FirstOrDefault? Когда вы всегда хотите тип по умолчанию, если нет результата?

    var result = List.Where(x => x == "foo").FirstOrDefault();
    
  • И в этом отношении, как насчет Take?

    var result = List.Where(x => x == "foo").Take(1);
    

Ответ 1

Я бы использовал First(), когда знаю или ожидаю, что в последовательности будет хотя бы один элемент. Другими словами, когда это исключительный случай, последовательность пуста.

Используйте FirstOrDefault(), когда вы знаете, что вам нужно проверить, был ли элемент или нет. Другими словами, когда допустимо, чтобы последовательность была пустой. Вы не должны полагаться на обработку исключений для проверки. (Это плохая практика и может повредить производительность).

Наконец, разница между First() и Take(1) состоит в том, что First() возвращает сам элемент, а Take(1) возвращает последовательность элементов, которая содержит ровно один элемент.

Ответ 2

.First выдаст исключение, если результатов нет. .FirstOrDefault не будет, он просто вернет либо нулевой (ссылочные типы), либо значение по умолчанию для типа значения. (например, например, 0 для int.) Вопрос здесь не в том, когда вы хотите использовать тип по умолчанию, но больше: готовы ли вы обрабатывать исключение или обрабатывать значение по умолчанию? Поскольку исключения должны быть исключительными, FirstOrDefault является предпочтительным, если вы не уверены, собираетесь ли вы получить результаты из своего запроса. Когда логически должны быть данные, обработка исключений может быть рассмотрена.

Skip() и Take() обычно используются при настройке поискового вызова в результатах. (Как показано первые 10 результатов, а следующие 10 на следующей странице и т.д.)

Надеюсь, это поможет.

Ответ 3

.First() сгенерирует исключение, если строка не будет возвращена, а .FirstOrDefault() вернет значение по умолчанию (NULL для всех ссылочных типов).

Так что, если вы готовы и готовы обработать возможное исключение, .First() подойдет. Если вы все равно предпочитаете проверять возвращаемое значение для != null, то .FirstOrDefault() - ваш лучший выбор.

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

Ответ 4

Первый()

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

FirstOrDefault()

  • Возвращает первый элемент последовательности или значение по умолчанию, если элемент не найден.
  • Он выдает ошибку Только в том случае, если источник имеет значение null.
  • вы должны использовать его, если ожидается более одного элемента, и вам нужен только первый элемент. Также хорошо, если результат пуст.

У нас есть таблица UserInfos, в которой есть некоторые записи, как показано ниже. На основе приведенной ниже таблицы я создал пример...

UserInfo Table

Как использовать First()

var result = dc.UserInfos.First(x => x.ID == 1);

Существует только одна запись, где ID == 1. Должен вернуть эту запись
ID: 1 Имя: Manish Фамилия: Dubey Электронная почта: [email protected]

var result = dc.UserInfos.First(x => x.FName == "Rahul");   

Есть несколько записей, где FName == "Rahul". Первая запись должна быть возвращена.
ID: 7 Имя: Rahul Фамилия: Sharma Электронная почта: [email protected]

var result = dc.UserInfos.First(x => x.ID ==13);

Нет записи с идентификатором == 13. Должна быть ошибка.
InvalidOperationException: Последовательность не содержит элементов

Как использовать FirstOrDefault()

var result = dc.UserInfos.FirstOrDefault(x => x.ID == 1);

Существует только одна запись, где ID == 1. Должен вернуть эту запись
ID: 1 Имя: Manish Фамилия: Dubey Электронная почта: [email protected]

var result = dc.UserInfos.FirstOrDefault(x => x.FName == "Rahul");

Есть несколько записей, где FName == "Rahul". Первая запись должна быть возвращена.
ID: 7 Имя: Rahul Фамилия: Sharma Электронная почта: [email protected]

var result = dc.UserInfos.FirstOrDefault(x => x.ID ==13);

Нет записи с идентификатором == 13. Возвращаемое значение равно null

Надеюсь, это поможет вам понять, когда использовать First() или FirstOrDefault().

Ответ 5

Прежде всего, Take - совершенно другой метод. Он возвращает IEnumerable<T>, а не один T, так что выходим.

Между First и FirstOrDefault вы должны использовать First, когда вы уверены, что элемент существует, а если нет, то есть ошибка.

Кстати, если ваша последовательность содержит default(T) элементов (например, null), и вам нужно различать пустое, а первый элемент - null, вы не можете использовать FirstOrDefault.

Ответ 6

Во-первых:

  • Возвращает первый элемент последовательности
  • Выдает исключение: в результате нет элементов
  • Использовать когда: Когда ожидается более 1 элемента, и вы хотите только первый

FirstOrDefault:

  • Возвращает первый элемент последовательности или значение по умолчанию, если элемент не найден
  • Выдает исключение: только если источник имеет значение null
  • Использовать когда: Когда ожидается более 1 элемента, и вы хотите только первый. Также нормально, чтобы результат был пустым.

От: http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/

Ответ 7

Еще одно отличие заключается в том, что если вы отлаживаете приложение в производственной среде, у вас может не быть доступа к номерам строк, поэтому определение того, какой конкретный оператор .First() в методе генерирует исключение, может быть затруднительным.

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

Вот почему я всегда использую FirstOrDefault(), хотя я знаю, что нулевая запись будет представлять исключительную ситуацию.

var customer = context.Customers.FirstOrDefault(i => i.Id == customerId);
if (customer == null)
{
   throw new Exception(string.Format("Can't find customer {0}.", customerId));
}

Ответ 8

Первый()

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

FirstOrDefault()

FirstOrDefault() аналогичен First(), за исключением того, что если ни один элемент не соответствует указанному условию, чем возвращает значение по умолчанию для базового типа общей коллекции. Он не бросает InvalidOperationException, если элемент не найден. Но коллекция элемента или последовательности имеет значение null, чем исключение.

Ответ 9

Я нашел веб-сайт, в котором apperars объясняет необходимость FirstOrDefault http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
Если результатов нет, и вы хотите вызвать First() или Single(), чтобы получить одну строку... Вы получите исключение "Последовательность не содержит элементов".

Отказ от ответственности: я никогда не использовал LINQ, поэтому извиняюсь, если это не соответствует значению.

Ответ 10

Этот тип функции принадлежит элементным операторам. Некоторые полезные операторы элементов определены ниже.

  1. Во-первых/FirstOrDefault
  2. Последняя /LastOrDefault
  3. Однолокальный /SingleOrDefault

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

  List<int> items = new List<int>() { 8, 5, 2, 4, 2, 6, 9, 2, 10 };

Оператор First() возвращает первый элемент последовательности после выполнения условия. Если элемент не найден, он выдаст исключение.

int result = items.Where(item => item == 2).First();

Оператор FirstOrDefault() возвращает первый элемент последовательности после выполнения условия. Если элемент не найден, он вернет значение по умолчанию этого типа.

int result1 = items.Where(item => item == 2).FirstOrDefault();

Ответ 11

someList.First(); // exception if collection is empty.
someList.FirstOrDefault(); // first item or default(Type)

Какой из них использовать? Это должно решаться бизнес-логикой, а не страх перед сбоем исключений/программ.

Например, Если бизнес-логика говорит, что мы не можем иметь нулевые транзакции в любой рабочий день (просто предположим). Тогда вы не должны пытаться справиться с этим сценарием с помощью некоторых интеллектуальных программ. Я всегда буду использовать First() над такой коллекцией, и пусть программа потерпит неудачу, если что-то еще испортит бизнес-логику.

код:

var transactionsOnWorkingDay = GetTransactionOnLatestWorkingDay();
var justNeedOneToProcess = transactionsOnWorkingDay.First(): //Not FirstOrDefault()

Я хотел бы видеть другие комментарии по этому поводу.

Ответ 12

Хорошо, позвольте мне дать мои два цента. First/Firstordefault предназначены для использования второго конструктора. Я не буду объяснять, что это такое, но это когда вы потенциально всегда будете использовать его, потому что вы не хотите вызывать исключение.

person = tmp.FirstOrDefault(new Func<Person, bool>((p) =>
{
    return string.IsNullOrEmpty(p.Relationship);
}));

Ответ 13

Извините за отправку ответа на старый пост. подробно и хорошее объяснение, поэтому, пожалуйста, прочитайте ниже URL http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/

http://www.dotnet-tricks.com/Tutorial/linq/E23I160714-Understanding-Single,-SingleOrDefault,-First-and-FirstOrDefault.html

http://www.c-sharpcorner.com/UploadFile/3d39b4/singleordefault-and-firstordefault-methods-in-linq-to-sql/

Ответ 14

linq много способов реализовать один простой запрос в коллекциях, просто мы записываем объединения в sql, фильтр может применяться первым или последним в зависимости от необходимости и необходимости.

Вот пример, где мы можем найти элемент с идентификатором в коллекции. Чтобы добавить больше об этом, методы First, FirstOrDefault, в идеале будут возвращены, если коллекция имеет хотя бы одну запись. Если, однако, коллекция в порядке, чтобы быть пустым. то First вернет исключение, но FirstOrDefault вернет null или значение по умолчанию. Например, int вернет 0. Таким образом, использование такого, хотя и считается личным предпочтением, но лучше использовать FirstOrDefault, чтобы избежать обработки исключений. вот пример, когда мы запускаем коллекцию списка транзакций