Я искал вокруг и не нашел четкого ответа относительно того, когда вы хотите использовать .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);
.First
и.FirstOrDefault
оба принимают предикаты в качестве аргументов, поэтомуvar result = List.Where(x => x == "foo").First();
могут быть переписаны какvar result = List.First(x => x == "foo");
Single
иSingleOrDefault
. Я ненавижу, когда люди используют,First
когда они действительно имеют в видуSingle
; ).FirstOrDefault()
всегда дает вам возможность создать более значимое исключение. Если выдается исключение последовательности и более одного.First()
в методе, может быть трудно определить, какое утверждение является проблемой.Ответы:
Я бы использовал,
First()
когда я знаю или ожидаю, что последовательность будет иметь хотя бы один элемент. Другими словами, когда это исключительный случай, последовательность пуста.Используйте,
FirstOrDefault()
когда вы знаете, что вам нужно будет проверить, был ли элемент или нет. Другими словами, когда допустимо, чтобы последовательность была пустой. Вы не должны полагаться на обработку исключений для проверки. (Это плохая практика и может повредить производительность).Наконец, разница между
First()
иTake(1)
заключается в том, чтоFirst()
возвращает сам элемент, аTake(1)
возвращает последовательность элементов, которая содержит ровно один элемент.источник
.First
выдаст исключение, когда нет результатов..FirstOrDefault
не будет, он просто вернет либо ноль (ссылочные типы), либо значение по умолчанию для типа значения. (например, как0
для int.) Вопрос здесь не в том, когда вам нужен тип по умолчанию, а в следующем: готовы ли вы обрабатывать исключение или обрабатывать значение по умолчанию? Так как исключения должны быть исключительными,FirstOrDefault
предпочтительнее, когда вы не уверены, собираетесь ли вы получить результаты из своего запроса. Когда логически данные должны быть там, обработка исключений может быть рассмотрена.Skip()
иTake()
обычно используются при настройке подкачки в результатах. (Например, показ первых 10 результатов и следующих 10 на следующей странице и т. Д.)Надеюсь это поможет.
источник
.FirstOrDefault
будет возвращать ноль для ссылочных типов. Я был озадачен тем, каким будет объект «по умолчанию». Этот ответ прояснил это..First()
выдаст исключение, если нет строки для возврата, а вместо этого.FirstOrDefault()
вернет значение по умолчанию (NULL
для всех ссылочных типов).Так что, если вы готовы и готовы обработать возможное исключение,
.First()
это нормально. Если вы!= null
все равно предпочитаете проверять возвращаемое значение , тогда.FirstOrDefault()
это ваш лучший выбор.Но я думаю, это тоже немного личного предпочтения. Используйте то, что имеет больше смысла для вас и лучше соответствует вашему стилю кодирования.
источник
Первый()
FirstOrDefault ()
У нас есть таблица UserInfos, в которой есть несколько записей, как показано ниже. На основе этой таблицы ниже я создал пример ...
Как использовать First ()
Существует только одна запись, в которой идентификатор == 1. Должен вернуть
идентификатор этой записи : 1 Имя: Маниш Фамилия: Дубей E-mail: xyz@xyz.com
Есть несколько записей, где FName == "Rahul". Первая запись должна быть возвращена.
ID: 7 Имя: Рахул Фамилия: Шарма Электронная почта: xyz1@xyz.com
Нет записи с идентификатором == 13. Должна возникнуть ошибка.
InvalidOperationException: последовательность не содержит элементов
Как использовать FirstOrDefault ()
Существует только одна запись, в которой идентификатор == 1. Должен вернуть
идентификатор этой записи : 1 Имя: Маниш Фамилия: Дубей E-mail: xyz@xyz.com
Есть несколько записей, где FName == "Rahul". Первая запись должна быть возвращена.
ID: 7 Имя: Рахул Фамилия: Шарма Электронная почта: xyz1@xyz.com
Нет записи с идентификатором == 13. Возвращаемое значение равно нулю
Надеюсь, это поможет вам понять, когда использовать
First()
илиFirstOrDefault()
.источник
Прежде всего,
Take
это совершенно другой метод. Возвращает,IEnumerable<T>
а не одинT
, так что нет.Между
First
иFirstOrDefault
, вы должны использовать,First
когда вы уверены, что элемент существует, а если нет, то есть ошибка.Между прочим, если ваша последовательность содержит
default(T)
элементы (напримерnull
), и вам нужно различать, является ли элемент пустым, а первым - бытьnull
, вы не можете его использоватьFirstOrDefault
.источник
Первый:
FirstOrDefault:
От: http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/
источник
Еще одно отличие, которое следует отметить, состоит в том, что если вы отлаживаете приложение в производственной среде, у вас может не быть доступа к номерам строк, поэтому определение того, какой конкретный
.First()
оператор в методе вызвал исключение, может быть затруднено.Сообщение об исключении также не будет содержать каких-либо лямбда-выражений, которые вы могли бы использовать, что могло бы затруднить отладку.
Вот почему я всегда использую,
FirstOrDefault()
хотя я знаю, что нулевая запись представляет собой исключительную ситуацию.источник
Первый()
Когда вы знаете, что результат содержит более 1 ожидаемого элемента, и вы должны только первый элемент последовательности.
FirstOrDefault ()
FirstOrDefault () аналогичен First () за исключением того, что если ни один элемент не соответствует указанному условию, он возвращает значение по умолчанию базового типа универсальной коллекции. Он не выдает InvalidOperationException, если элемент не найден. Но коллекция элемента или последовательности равна нулю, чем исключение.
источник
Этот тип функции принадлежит элементным операторам. Некоторые полезные операторы элементов определены ниже.
Мы используем операторы элементов, когда нам нужно выбрать один элемент из последовательности на основе определенного условия. Вот пример.
Оператор First () возвращает первый элемент последовательности после выполнения условия. Если элемент не найден, он выдаст исключение.
int result = items.Where (item => item == 2) .First ();
Оператор FirstOrDefault () возвращает первый элемент последовательности после выполнения условия. Если элемент не найден, он вернет значение по умолчанию этого типа.
int result1 = items.Where (item => item == 2) .FirstOrDefault ();
источник
Я нашел сайт , который apperars объяснить необходимость FirstOrDefault
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
Если нет результатов в запросе, и вы хотите , чтобы позвонить в первую очередь () или Single (), чтобы получить одну строку ... Вы получите исключение «Последовательность не содержит элементов».
Отказ от ответственности: я никогда не использовал LINQ, поэтому мои извинения, если это далеко от истины.
источник
Какой использовать? Это должно решаться бизнес-логикой, а не боязнью отказа / сбоя программы.
Например, если бизнес-логика говорит, что мы не можем иметь нулевые транзакции в любой рабочий день (просто предположим). Тогда вам не следует пытаться справиться с этим сценарием с помощью какого-то умного программирования. Я всегда буду использовать First () над такой коллекцией, и позволю программе завершиться ошибкой, если что-то еще испортит бизнес-логику.
Код:
Я хотел бы видеть другие комментарии по этому поводу.
источник
Хорошо, позвольте мне дать два моих цента. First / Firstordefault для, когда вы используете второй конструктор. Я не буду объяснять, что это такое, но это когда вы потенциально всегда используете один, потому что вы не хотите вызывать исключение.
источник
Другие очень хорошо описали разницу между
First()
иFirstOrDefault()
. Я хочу сделать еще один шаг в интерпретации семантики этих методов. По моему мнению,FirstOrDefault
это слишком злоупотребляют. В большинстве случаев, когда вы фильтруете данные, вы ожидаете получить коллекцию элементов, соответствующих логическому условию, или один уникальный элемент по его уникальному идентификатору, такой как пользователь, книга, публикация и т. Д. почему мы можем даже сказать, чтоFirstOrDefault()
это запах кода не потому, что с ним что-то не так, а потому, что он используется слишком часто. Этот пост в блоге исследует тему в деталях. ИМО в большинстве случаевSingleOrDefault()
это гораздо лучшая альтернатива, поэтому следите за этой ошибкой и убедитесь, что вы используете наиболее подходящий метод, который четко отражает ваш контракт и ожидания.источник
У linq много способов реализовать один простой запрос к коллекциям, просто мы пишем соединения в sql, фильтр может применяться первым или последним в зависимости от необходимости и необходимости.
Вот пример, где мы можем найти элемент с идентификатором в коллекции. Чтобы добавить больше к этому, методы First, в
FirstOrDefault
идеале, должны возвращать то же самое, когда в коллекции есть хотя бы одна запись. Если, однако, коллекция может быть пустой. затемFirst
вернет исключение, ноFirstOrDefault
вернетnull
или по умолчанию. Например,int
вернет 0. Таким образом, использование такового хотя и считается личным предпочтением, но его лучше использовать,FirstOrDefault
чтобы избежать обработки исключений.источник