Я пишу много такого кода, чтобы выбрать один элемент, который соответствует
var item = (from x in Items where x.Id == 123 select x).First();
Есть ли более чистый способ сделать это или это настолько кратко, насколько я собираюсь получить?
РЕДАКТИРОВАТЬ: следовало бы сказать «Более чистый способ с использованием синтаксиса linq». Я уже знал о синтаксисе лямбда, и мне стало казаться, что это единственный способ. Тем не менее, я получил некоторую полезную информацию, поэтому спасибо всем, кто ответил.
Single()
иSingleOrDefault()
ЕСЛИ я знаю, что данные уже уникальны (например, из базы данных, которая имеет это ограничение и т.д.), посколькуSingle()
заставляет его сканировать оставшуюся часть списка, чтобы найти возможный дубликат, но это я. Если вам нужно усилить свою уникальность на этом этапе, используйтеSingle()
family, если нет, используйтеFirst()
family.Ответы:
В зависимости от того, насколько вам нравится синтаксис запроса linq, вы можете использовать методы расширения напрямую, например:
А если вы не хотите выдавать ошибку, если список пуст, используйте,
FirstOrDefault
который возвращает значение по умолчанию для типа элемента (null
для ссылочных типов):Single()
иSingleOrDefault()
также может быть использован, но если вы читаете из базы данных или чего-то, что уже гарантирует уникальность, я бы не стал беспокоиться, поскольку он должен сканировать список, чтобы увидеть, есть ли какие-либо дубликаты и выбросы.First()
иFirstOrDefault()
останавливаются на первом совпадении, чтобы они были более эффективными.Из
First()
иSingle()
семьи, вот где они бросают:First()
- бросает, если пуст / не найден, не бросает, если дублируетсяFirstOrDefault()
- возвращает значение по умолчанию, если пусто / не найдено, не выбрасывает, если дублируетсяSingle()
- выбрасывает, если пусто / не найдено, выбрасывает, если существует дубликатSingleOrDefault()
- возвращает значение по умолчанию, если пусто / не найдено, выбрасывает, если существует дубликатисточник
i.Id == 123
FirstOrDefault или SingleOrDefault могут быть полезны, в зависимости от вашего сценария и от того, хотите ли вы обрабатывать ноль или более одного совпадения:
Я не знаю, как это работает в запросе linq 'from', но в синтаксисе лямбда это выглядит так:
источник
Это предпочтительные методы:
Или
источник
Чтобы облегчить кому-то жизнь, запрос linq с лямбда-выражением
приводит к SQL-запросу с
select top (1)
в нем.источник
Это можно лучше свести к следующему.
var item = Items.First(x => x.Id == 123);
Ваш запрос в настоящее время собирает все результаты (а их может быть несколько) в перечисляемом списке, а затем берет первый из этого набора, выполняя больше работы, чем необходимо.
Single / SingleOrDefault имеет смысл, но только если вы хотите перебрать всю коллекцию и убедиться, что совпадение уникально, в дополнение к выбору этого совпадения. First / FirstOrDefault просто возьмет первое совпадение и уйдет, независимо от того, сколько дубликатов действительно существует.
источник
Вы можете использовать синтаксис метода расширения:
В остальном я не уверен, насколько более кратким можно было бы стать, если бы, возможно, не написали свои собственные специализированные методы расширения «First» и «FirstOrDefault».
источник
Where
в виду противоположноеSelect
, которое уже было сказано, но этот ответ неверен. Select в C # изменяет результаты на IEnumerable <bool>, поэтому вы получаете abool
для первого элементаx.Id == 123
Я расскажу, что у меня сработало:
Мой идентификатор - это строка, которую я хочу запросить, в этом случае я получил ее из radGrid, затем я использовал ее для запроса, но этот запрос возвращает строку, затем вы можете присвоить значения, полученные из запроса, в текстовое поле или что-то еще , Мне пришлось назначить их текстовому полю.
источник