В зависимости от того, насколько вам нравится синтаксис запроса linq, вы можете использовать методы расширения напрямую, например:
var item = Items.First(i => i.Id == 123);
А если вы не хотите выдавать ошибку, если список пуст, используйте, FirstOrDefaultкоторый возвращает значение по умолчанию для типа элемента ( nullдля ссылочных типов):
var item = Items.FirstOrDefault(i => i.Id == 123);
if (item != null)
{
// found it
}
Single()и SingleOrDefault()также может быть использован, но если вы читаете из базы данных или чего-то, что уже гарантирует уникальность, я бы не стал беспокоиться, поскольку он должен сканировать список, чтобы увидеть, есть ли какие-либо дубликаты и выбросы. First()и FirstOrDefault()останавливаются на первом совпадении, чтобы они были более эффективными.
Из First()и Single()семьи, вот где они бросают:
First() - бросает, если пуст / не найден, не бросает, если дублируется
FirstOrDefault() - возвращает значение по умолчанию, если пусто / не найдено, не выбрасывает, если дублируется
Single() - выбрасывает, если пусто / не найдено, выбрасывает, если существует дубликат
SingleOrDefault() - возвращает значение по умолчанию, если пусто / не найдено, выбрасывает, если существует дубликат
Single()иSingleOrDefault()ЕСЛИ я знаю, что данные уже уникальны (например, из базы данных, которая имеет это ограничение и т.д.), посколькуSingle()заставляет его сканировать оставшуюся часть списка, чтобы найти возможный дубликат, но это я. Если вам нужно усилить свою уникальность на этом этапе, используйтеSingle()family, если нет, используйтеFirst()family.