2012-01-13 15 views
35

¿Alguien puede explicar cómo se puede usar DefaultIfEmpty() en LINQ? He preparado algo de material pero todavía necesito algo sólido para ver cuál es su uso.DefaultIfEmpty en LINQ

+1

¿Qué no entiendes acerca de su uso? – Oded

+3

Realmente no entiendo para qué lo usarías, tampoco. Devuelve un 'IEnumerable ', por lo que si usó '.DefaultIfEmpty(). First()' es lo mismo que '.FirstOrDefault()' ... [Los ejemplos en MSDN] (http://msdn.microsoft. com/en-us/library/bb360179.aspx) son realmente malas. – Ryan

+1

Un uso es para que no tenga que dividir el código con las pruebas 'if (x! = Null)'. – ChrisF

Respuesta

37

Básicamente devuelve una colección con un solo elemento en caso de que la colección de origen esté vacía.

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

devuelve 1

pero

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

devuelve 12 como la colección está vacía

+0

Oh, está bien. Aunque es un poco tonto que no puedas hacer '.FirstOrDefault (12)' en su lugar. – Ryan

+3

DefaultIfEmpty devuelve un elemento mientras DefaultIfEmpty devuelve una colección que luego se puede conectar en cascada a otra operación de linq en la cadena. –

+5

@ vc74: fue ese primer 'DefaultIfEmpty' destinado a ser' FirstOrDefault' (en tu comentario)? – Chris

7

La diferencia es la DefaultIfEmpty devuelve una colección de objetos mientras FirstOrDefault devuelve un objeto. Si no se encontraron resultados, DefaultIfEmpty aún devuelve un Enumerable con un solo elemento que tiene su valor predeterminado, mientras que FirstOrDefault devuelve T mismo.

Utiliza DefaultIfEmpty si necesita siempre un resultado de la colección, por ejemplo para crear uniones externas. Utiliza FirstOrDefault si siempre necesita un resultado de objeto (no una colección), por ejemplo, si desea obtener el primer elemento (o solo artículo) cuando busca algo como una ID o correo electrónico único, y desea devolver el artículo vacío predeterminado si el artículo que estabas buscando no fue encontrado.