Последовательность не содержит исключений элементов в linq даже без использования Single

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

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

это исключение происходит, когда нет запаса, начинающегося с name 'A'.

кажется, что один метод расширения ожидает по крайней мере один элемент, удовлетворяющий условию, но это не ожидается.

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

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

3 ответов


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

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

(редактировать: вы можете увернуться от этого с .DefaultIfEmpty(string.Empty) затем по существующей Aggregate перегрузка. Этот запятую не выдаст.)

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

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

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


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

new string[]{}.Aggregate("", (a,b)=> a+b )

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

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