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

Я не использую Single в LINQ ниже, но я все еще получаю исключение "Sequence contains no elements":

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

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

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

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

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

Ответ 1

Как отметил Деннис Трауб, перегрузка 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 в массив.

Ответ 2

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

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