我在下面的LINQ中没有使用Single
,但我仍然得到一个'序列不包含任何元素'例外:
allNames = StockCollection.Where((s) => s.Name.IndexOf("A") == 0)
.Select((s) => s.Name)
.Aggregate((namesInfo, name) => namesInfo += ", " + name);
当没有以名称'A'
开头的股票时会出现此例外。
似乎一种扩展方法期望至少一个元素满足条件,但不期望。
您能否提出解决此问题的最佳解决方案?
提前致谢。
答案 0 :(得分:63)
正如Dennis Traub指出的那样,当你的源序列为空时,你正在使用Aggregate
的重载抛出异常。
显而易见的解决方法是使用other overload of Aggregate
that accepts an initial seed(你想要string.Empty
),但这会导致结果中的前导逗号,你将不得不摆脱它。
(编辑:您可以使用.DefaultIfEmpty(string.Empty)
,然后是现有的Aggregate
重载来躲避此操作。这不会产生前导逗号。)
在任何情况下,使用Aggregate
来加入字符串都不是一个好主意(产生Schlemiel the Painter's algorithm)。以下是我编写查询的方法:
allNames = string.Join(",", StockCollection.Select(s => s.Name)
.Where(name => name.StartsWith("A"));
在.NET 3.5中,您需要使用。ToArray()
将Where
结果具体化为数组。
答案 1 :(得分:10)
使用空种子。
new string[]{}.Aggregate("", (a,b)=> a+b )
答案 2 :(得分:7)
在空源上使用Aggregate(func)会抛出InvalidOperationException。