2011-04-10 4 views
49

¿Hay un método de búsqueda linq lambda que devuelve nulo, en lugar de arrojar una excepción, al buscar en una lista?Buscar() y Primero() arroja excepciones, ¿cómo devolver nulo en su lugar?

Mi solución actual es algo así como: (para evitar la excepción de ser lanzado)

if (list.Exists(x => x.Foo == Foo)) 
{ 
    var listItem = list.Find(x => x.Foo == Foo); 
} 

Se siente mal repetir la expresión.

Algo así como ...

var listItem = list.Find(x => x.Foo == Foo); 
if (listItem != null) 
{ 
    //Do stuff 
} 

... se siente mejor para mí. O solo soy yo?

¿Tiene un mejor enfoque en este caso? (La solución no tiene que estar volviendo nula, simplemente una mejor solución es buena)

Respuesta

97
var listItem = list.FirstOrDefault(x => x.Foo == Foo); 
if (listItem != null) 
{ 
    //Do stuff 
} 
29
respuesta

de Bala R es correcta, sólo quería añadir un dato:

Tenga en cuenta que si List<T> contiene objetos que por diseño no pueden ser nulos, el FirstOrDefault devolverá algo más que null. El compilador probablemente dará una advertencia/error de esto en la declaración if. En ese caso, debería acercarse a su situación como esta:

List<MyObjectThatCannotBeNull> list; 
var listItem = list.FirstOrDefault(x => x.Foo == Foo); 
if (!listItem.Equals(default(MyObjectThatCannotBeNull))) 
{ 
    //Do stuff 
} 
+4

y no se olvide - si su lista contendrá el valor por defecto para ese tipo genérico ([Valores predeterminados Tabla] (http://msdn.microsoft. com/en-us/library/83fhsxwc.aspx)), no puede decir si el valor existe o no usando el método 'Find'. Deberías usar 'FindIndex',' Existe' o 'Contiene' en esas situaciones. – HuBeZa

Cuestiones relacionadas