简体   繁体   中英

Sequence contains no elements exception in linq without even using Single

I am not using Single in LINQ below, but I am still getting a 'Sequence contains no elements' exception:

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

This exception comes when there is no stock starting with name 'A' .

It seems that one extension method is expecting atleast one element satisfying the condition but that's not expected.

Can you please suggest the best solution to resolve this?

Thanks in advance.

As Dennis Traub has pointed out, the overload of Aggregate you are using throws that exception when the source sequence is empty.

The obvious fix is to use the other overload of Aggregate that accepts an initial seed (you want string.Empty ), but that would result in a leading comma in the result which you'll have to get rid of.

( EDIT : You can dodge this with .DefaultIfEmpty(string.Empty) followed by your existing Aggregate overload. This wouldn't produce a leading comma.)

In any case, using Aggregate like that to join strings isn't a great idea (produces a Schlemiel the Painter's algorithm ). Here's how I would write the query:

allNames = string.Join(",", StockCollection.Select(s => s.Name)
                                           .Where(name => name.StartsWith("A"));

In .NET 3.5, you'll need a . ToArray() to materialize the Where results into an array.

与空种子一起使用。

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

Using Aggregate(func) on an empty source throws an InvalidOperationException.

See documentation: http://msdn.microsoft.com/en-us/library/bb548651.aspx

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM