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.
Best Answer
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 wantstring.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 existingAggregate
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:In .NET 3.5, you'll need a .
ToArray()
to materialize theWhere
results into an array.