2012-01-13 6 views
35

Qualcuno può spiegare come DefaultIfEmpty() può essere utilizzato in LINQ. Ho preparato del materiale ma ho ancora bisogno di qualcosa di solido per vedere quale sia il suo utilizzo.DefaultIfEmpty in LINQ

+1

Cosa non capisci del suo utilizzo? – Oded

+3

Non capisco davvero per cosa lo usereste. Restituisce un 'IEnumerable ', quindi se hai usato '.DefaultIfEmpty(). Primo()' è lo stesso di '.FirstOrDefault()' ... [Gli esempi su MSDN] (http://msdn.microsoft. it/it/us/library/bb360179.aspx) sono davvero pessimi. – Ryan

+1

Un uso è quindi non è necessario suddividere il codice con i test 'if (x! = Null)'. – ChrisF

risposta

37

In pratica restituisce una raccolta con un singolo elemento nel caso in cui la raccolta di origine sia vuota.

var numbers = new int[] {1, 2, 3}; 
var aNumber = numbers.First(); 

restituisce 1

ma

var numbers = new int[]; 
var aNumber = numbers.DefaultIfEmpty(12).Single(); 

restituisce 12 come la raccolta è vuota

+0

Oh, ok. Un po 'sciocco che invece non puoi fare '.FirstOrDefault (12)'. – Ryan

+3

DefaultIfEmpty restituisce un elemento, mentre DefaultIfEmpty restituisce una raccolta che può quindi essere sovrapposta a un'altra operazione linq nella catena. –

+5

@ vc74: era il primo 'DefaultIfEmpty' che voleva essere' FirstOrDefault' (nel tuo commento)? – Chris

7

La differenza è la DefaultIfEmpty restituisce un insieme di oggetti durante FirstOrDefault restituisce un oggetto. Se non sono stati trovati risultati DefaultIfEmpty restituisce ancora un Enumerable con un singolo elemento che ha il suo valore predefinito, mentre FirstOrDefault restituisce T stesso.

Si utilizza DefaultIfEmpty se è sempre necessario un risultato di raccolta, ad esempio per creare join esterni. Si utilizza FirstOrDefault se si ha sempre bisogno di un risultato di oggetto (non di una raccolta), ad esempio se si desidera ottenere il primo oggetto (o solo l'articolo) durante la ricerca di qualcosa come un ID o un'e-mail univoca e si desidera restituire l'elemento vuoto predefinito se l'oggetto che stavi cercando non è stato trovato.