SingleOrDefault () выдает исключение больше чем на одном элементе

Я получаю исключение каждый раз, когда я выбираю как это

Feature f = o.Features.SingleOrDefault(e => e.LinkName == PageLink);

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

15
задан Marcel 23 October 2014 в 09:14
поделиться

5 ответов

Single и SingleOrDefault предназначены для выдачи, если в последовательности существует более одного совпадения. Следствием этого является то, что вся последовательность должна быть повторена до завершения. Это не похоже на то, что вы хотите. Вместо этого попробуйте FirstOrDefault:

Feature f = o.Features
    .FirstOrDefault(e => e.vcr_LinkName == PageLink && e.bit_Activate == true);

Это (как правило) будет работать лучше, потому что оно завершится, как только будет найдено совпадение.

Конечно, если вы действительно хотите сохранить более одного элемента, предложение Where было бы более подходящим:

IEnumerable<Feature> fs = o.Features
    .Where(e => e.vcr_LinkName == PageLink && e.bit_Activate == true);
29
ответ дан 30 November 2019 в 23:51
поделиться

SingleOrDefault предполагает, что вы ожидаете от вашего запроса 0 или 1 результат. Если у вас их больше 1, значит, с вашими данными или запросом что-то не так.

Если вы ожидаете более одного результата и хотите получить только первый, тогда следует использовать FirstOrDefault .

4
ответ дан 30 November 2019 в 23:51
поделиться

Если вы хотите сначала только элемент, используйте вместо него FirstOrDefault .

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

  • Ровно один: Один
  • Один или ноль: SingleOrDefault
  • Один или несколько: Первый
  • Ноль или несколько: FirstOrDefault

( ElementAt и ElementAtOrDefault , Last ] и LastOrDefault также доступны.)

14
ответ дан 30 November 2019 в 23:51
поделиться

Если вы используете SingleOrDefault, если условие удовлетворяет больше, чем результат, это приведет к ошибке.

Вы можете достичь результата, используя FirstOrDefault

1
ответ дан 30 November 2019 в 23:51
поделиться

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

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

2
ответ дан 30 November 2019 в 23:51
поделиться
Другие вопросы по тегам:

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