Linq-код для выбора одного элемента

Я пишу много кода, подобного этому, чтобы выбрать один элемент, который соответствует

var item = (from x in Items where x.Id == 123 select x).First();

Есть ли более чистый способ сделать это или это так кратко, как я собираюсь получить?

РЕДАКТИРОВАТЬ: Должен был сказать "Более чистый путь с использованием синтаксиса linq". Я уже знал о лямбда-синтаксисе, и он начинает выглядеть так, будто это единственный выход. Я получил некоторую полезную информацию, так что спасибо всем, кто ответил.

88 голосов | спросил Mikey Hogarth 18 +04002011-10-18T19:26:23+04:00312011bEurope/MoscowTue, 18 Oct 2011 19:26:23 +0400 2011, 19:26:23

6 ответов


0

Зависит от того, насколько вам нравится синтаксис запроса 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() - возвращает значение по умолчанию, если оно пустое /не найдено, и выбрасывает, если дубликат существует
ответил James Michael Hare 18 +04002011-10-18T19:28:15+04:00312011bEurope/MoscowTue, 18 Oct 2011 19:28:15 +0400 2011, 19:28:15
0

FirstOrDefault или SingleOrDefault может быть полезным в зависимости от вашего сценария и от того, хотите обработать, чтобы было ноль или более одного совпадения:

  

FirstOrDefault: возвращает первый элемент последовательности или значение по умолчанию, если элемент не найден.

     

SingleOrDefault: возвращает единственный элемент последовательности или значение по умолчанию   значение, если последовательность пуста; этот метод выдает исключение, если   в последовательности более одного элемента

Я не знаю, как это работает в запросе linq 'from', но в лямбда-синтаксисе это выглядит так:

var item1 = Items.FirstOrDefault(x => x.Id == 123);
var item2 = Items.SingleOrDefault(x => x.Id == 123);
ответил stuartd 18 +04002011-10-18T19:27:44+04:00312011bEurope/MoscowTue, 18 Oct 2011 19:27:44 +0400 2011, 19:27:44
0

Это предпочтительные методы:

var item = Items.SingleOrDefault(x => x.Id == 123);

или

var item = Items.Single(x => x.Id == 123);
ответил James Hill 18 +04002011-10-18T19:27:57+04:00312011bEurope/MoscowTue, 18 Oct 2011 19:27:57 +0400 2011, 19:27:57
0

Это может быть лучше сведено к этому.

var item = Items.First(x => x.Id == 123);

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

Single /SingleOrDefault имеют смысл, но только если вы хотите выполнить итерацию всей коллекции и убедиться, что совпадение является уникальным в дополнение к выбору этого совпадения. First /FirstOrDefault просто возьмет первое совпадение и уйдет, независимо от того, сколько фактически существует дубликатов.

ответил Chris Hannon 18 +04002011-10-18T19:36:06+04:00312011bEurope/MoscowTue, 18 Oct 2011 19:36:06 +0400 2011, 19:36:06
0

Просто чтобы сделать чью-то жизнь проще, запрос linq с лямбда-выражением

(from x in Items where x.Id == 123 select x).FirstOrDefault();

действительно приводит к запросу SQL с select top (1) в нем.

ответил Amal 7 32012vEurope/Moscow11bEurope/MoscowWed, 07 Nov 2012 18:11:04 +0400 2012, 18:11:04
0

Я расскажу вам, что сработало для меня:

int id = int.Parse(insertItem.OwnerTableView.DataKeyValues[insertItem.ItemIndex]["id_usuario"].ToString());

var query = user.First(x => x.id_usuario == id);
tbUsername.Text = query.username;
tbEmail.Text = query.email;
tbPassword.Text = query.password;

Мой идентификатор - это строка, которую я хочу запросить, в данном случае я получил ее из radGrid, затем я использовал ее для запроса, но этот запрос возвращает строку, затем вы можете присвоить значения, полученные из запроса, в текстовое поле или что-то еще, я должен был назначить их в текстовое поле.

ответил G Jeny Ramirez 13 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 13 Sep 2013 18:11:23 +0400 2013, 18:11:23

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132