Последовательность не содержит исключений элементов в linq, даже не используя Single - PullRequest
33 голосов
/ 15 января 2012

Я не использую Single в LINQ ниже, но я все еще получаю исключение «Последовательность не содержит элементов»:

allNames = StockCollection.Where((s) => s.Name.IndexOf("A") == 0)
                          .Select((s) => s.Name)
                          .Aggregate((namesInfo, name) => namesInfo += ", " + name);

Это исключение возникает, когда нет запаса, начинающегося с имени 'A'.

Похоже, что один из методов расширения предполагает, что хотя бы один элемент удовлетворяет условию, но это не ожидается.

Не могли бы вы предложить лучшее решение для решения этой проблемы?

Заранее спасибо.

Ответы [ 3 ]

63 голосов
/ 15 января 2012

Как отметил Деннис Трауб, перегрузка Aggregate, которую вы используете, выдает это исключение, когда исходная последовательность пуста.

Очевидное решение - использовать другую перегрузку Aggregate, которая принимает начальное начальное число (вы хотите string.Empty), но это приведет к запятой в результате, который вы должен избавиться от.

( РЕДАКТИРОВАТЬ : Вы можете увернуться от этого с .DefaultIfEmpty(string.Empty), за которым следует существующая перегрузка Aggregate. Это не приведет к появлению ведущей запятой.)

В любом случае, использование Aggregate подобным образом для объединения строк не является хорошей идеей (создает алгоритм Schlemiel the Painter ). Вот как бы я написал запрос:

allNames = string.Join(",", StockCollection.Select(s => s.Name)
                                           .Where(name => name.StartsWith("A"));

В .NET 3.5 вам потребуется. ToArray() для материализации результатов Where в массив.

10 голосов
/ 07 февраля 2015

Использовать с пустым семенем.

new string[]{}.Aggregate("", (a,b)=> a+b )
7 голосов
/ 15 января 2012

Использование Aggregate (func) в пустом источнике вызывает исключение InvalidOperationException.

См. Документацию: http://msdn.microsoft.com/en-us/library/bb548651.aspx

...