2010-06-18 24 views
78

¿Hay un método predeterminado definido en .Net para C# para eliminar todos los elementos dentro de una lista que son null?¿Cómo eliminar todos los elementos nulos dentro de una lista genérica de una vez?

List<EmailParameterClass> parameterList = new List<EmailParameterClass>{param1, param2, param3...}; 

Digamos que algunos de los parámetros son null; No puedo saber de antemano y quiero eliminarlos de mi lista para que solo contenga parámetros que no sean nulos.

Respuesta

160

Es probable que desee lo siguiente.

List<EmailParameterClass> parameterList = new List<EmailParameterClass>{param1, param2, param3...}; 
parameterList.RemoveAll(item => item == null); 
+1

Sí, esto es lo mismo que mi respuesta, pero utilizando la sintaxis lambda nueva C# 3. –

+0

@ Mark: Vi los segundos publicados y el hombre estaba cerca (32, 33 y 34). ;) – Lance

+0

Ha :) Bueno, juego limpio - tu respuesta usó la sintaxis más ordenada así que +1 –

21

El método RemoveAll debe hacer el truco:

parameterList.RemoveAll(delegate (object o) { return o == null; }); 
+0

¿Por qué no utilizar el lambda? –

+8

Esta es una respuesta de cuatro años. En el momento C# 3 era relativamente nuevo, y yo todavía estaba usando C# 2 día a día. La sintaxis lambda es ahora el camino a seguir; sin embargo, esta sigue siendo una respuesta operativa, así que la dejé aquí para que cualquiera pueda usar la sintaxis más nueva (por el motivo que sea). –

+2

No sabía que la sintaxis lambda vino más tarde. ¡Gracias por su explicación! Sin duda es válido. –

28

No conozco ningún método incorporado, pero sólo podía utilizar LINQ:

parameterList = parameterList.Where(x => x != null).ToList(); 
+2

Esto debería evitarse si 'parameterList' ya es una Lista, ya que creará innecesariamente una nueva copia. En ese caso, use el método 'RemoveAll' como sugieren otros. – Nick

+0

Esta es probablemente la mejor opción si la colección es una "Matriz". – Andrew

3
List<EmailParameterClass> parameterList = new List<EmailParameterClass>{param1, param2, param3...}; 

parameterList = parameterList.Where(param => param != null).ToList(); 
2

El método OfType() omitirá los valores nulos:

List<EmailParameterClass> parameterList = 
    new List<EmailParameterClass>{param1, param2, param3...}; 

IList<EmailParameterClass> parameterList_notnull = 
    parameterList.OfType<EmailParameterClass>(); 
+0

En cierto modo, este es un buen enfoque, pero trae una sorpresa para el desarrollador que solo piensa que 'OfType' selecciona objetos de cierto tipo, sin pensar que no incluirá valores' nulos' ... Entonces yo ' Estoy un poco cansado de introducir esto en mi propio código. –

+0

@ BjörnAliGöransson De acuerdo. Es una solución interesante, pero no "lee" muy claramente. El uso de .RemoveAll con una lambda aún mantiene todo en una sola línea, al tiempo que lo hace realmente obvio en cuanto a lo que el desarrollador que lo escribió estaba tratando de lograr. Sin embargo, esto podría ser útil si hay un beneficio de velocidad que vale la pena. – MattD

1

fácil y sin LINQ:

while (parameterList.Remove(null)) {}; 
+0

Ese método está en la clase 'List' justo al lado de' RemoveAll', así que lo recomendaría para mayor claridad. Si el rendimiento resultó ser crucial, entonces puede seguir este enfoque (aunque eliminaría los corchetes y probablemente agregue un comentario para los desarrolladores que no conocen). – Andrew

+0

@Andrew: de acuerdo con MSDN, RemoveAll no toma nulo. Creo que también lo he probado. Un comentario tiene sentido sin embargo. –

+0

'RemoveAll' recibió un' Predicado', por lo que debe usar 'RemoveAll (x => x == null)', como se ve en la respuesta aceptada y de Mark Bell. – Andrew

Cuestiones relacionadas