2012-01-15 11 views
29

non sto usando Single in LINQ in basso, ma sto ancora ottenendo un 'sequenza non contiene elementi' eccezione:sequenza non contiene elementi un'eccezione in LINQ senza nemmeno usare singolo

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

Questa eccezione viene quando c'è nessuna azione che inizia con il nome 'A'.

Sembra che un metodo di estensione si aspetti almeno un elemento che soddisfa la condizione ma non è previsto.

Potete suggerire la soluzione migliore per risolvere questo problema?

Grazie in anticipo.

risposta

56

Come Dennis Traub ha fatto notare, il sovraccarico di Aggregate si utilizza genera questa eccezione quando la sequenza sorgente è vuoto.

La correzione evidente è quello di utilizzare il other overload of Aggregate that accepts an initial seed (che si desidera string.Empty), ma che si tradurrebbe in una virgola leader nel risultato che si dovrà sbarazzarsi.

(EDIT:. Si può schivare questo con .DefaultIfEmpty(string.Empty) seguito dal vostro attuale Aggregate sovraccarico Questo non produrrebbe una virgola leader.)

In ogni caso, utilizzando Aggregate come quella di unire le stringhe non è una grande idea (produce un Schlemiel the Painter's algorithm). Ecco come avrei scritto la query:

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

In .NET 3.5, avrete bisogno di un. ToArray() per materializzare i risultati di Where in un array.

+0

Grazie mille per la risposta ho intenzione di provare questo ora .. Ma ancora voglio sapere perché aggregato sta gettando un'eccezione. –

+0

@D J: perché? Quale valore ragionevole potrebbe restituire? Forse il valore predefinito del tipo restituito ('null' in questo caso), ma non lo vorrei. – Ani

+1

Il problema è come se non sapessimo in fase di esecuzione che la nostra collezione avrà qualche oggetto o no? quindi non dovrebbe generare un'eccezione o può solo restituire il valore predefinito. –

8

Utilizzare con seme vuoto.

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