Подтвердить что ты не робот

Последовательность не содержит исключений элементов в 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'.

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

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

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

4b9b3361

Ответ 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 )