Последовательность не содержит исключений элементов в 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
результаты в массив.
использование Aggregate (func) в пустом источнике вызывает исключение InvalidOperationException.
см. документацию:http://msdn.microsoft.com/en-us/library/bb548651.aspx