No permita que la lista sea nula
Asegúrese de que el objeto está siempre en un estado válido. Al asegurarse de que la lista nunca sea nula, nunca debe verificar que la lista sea nula.
public class MyClass
{
private readonly IEnumerable<int> ints;
public MyClass(IEnumerable<int> ints)
{
this.ints = ints;
}
public IEnumerable<int> IntsGreaterThan5()
{
return this.ints.Where(x => x > 5);
}
}
Aunque esta lista estaban vacías, todavía se obtendría una vuelta válida IEnumerable<int>
.
Max y Min sobrecargas mediante los tipos anulables
Eso todavía no resuelve el problema "min" "Max" y sin embargo. Hay una sobrecarga de Max y Min que toman selectores. Esos sobrecargas selectores pueden volver enteros con valores nulos, por lo que su método se convierte en máximo esto:
this.ints.Max(x => new int?(x));
Por lo tanto, se corre Max y comprobar para ver si usted ha conseguido un valor nulo o un número entero de vuelta. voila!
Otras Opciones
métodos de extensión personalizada
También puede escribir sus propios métodos de extensión.
public static MinMaxHelper()
{
public static int? MaxOrDefault(IEnumerable<int> ints)
{
if(!ints.Any())
{
return null;
}
return ints.Max();
}
public static int MaxOrDefault(IEnumerable<int> ints, int defaultValue)
{
if(!ints.Any())
{
return defaultValue;
}
return ints.Max();
}
}
Sustitución de métodos de extensión LINQ
Y por último, recordar que la estructura en métodos de extensión LINQ se puede anular con sus propios métodos de extensión con las firmas correspondientes. Por lo tanto, podría escribir un método de extensión para reemplazar .Where (...) y .Max (...) para devolver nulo (o un valor predeterminado) en lugar de arrojar una ArgumentNullException si el Enumerable es nulo.
En mi humilde opinión, los objetos como una lista nunca deben ser nulos. Siempre los inicializo si son miembros de la clase, y si se devuelven desde una función de mi propia creación, me aseguro de que la función devuelva una lista vacía en lugar de nula. –
Posible duplicado de la respuesta en: http://stackoverflow.com/questions/41319/checking-if-a-list-is-empty-with-linq – VS1
Siempre puede escribir sus propios métodos de extensión para usar las acciones tales como Where() o Max() que incluiría su prueba nula y Count antes de usar el método de extensión real. – Paul