序列在linq中不包含任何元素异常,甚至不使用Single

时间:2012-01-15 06:08:25

标签: c# string linq linq-to-objects sequences

我在下面的LINQ中没有使用Single,但我仍然得到一个'序列不包含任何元素'例外:

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

当没有以名称'A'开头的股票时会出现此例外。

似乎一种扩展方法期望至少一个元素满足条件,但不期望。

您能否提出解决此问题的最佳解决方案?

提前致谢。

3 个答案:

答案 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。

请参阅文档:http://msdn.microsoft.com/en-us/library/bb548651.aspx