2010-06-18 7 views
78

Existe-t-il une méthode par défaut définie dans .Net pour C# pour supprimer tous les éléments d'une liste qui sont null?Comment supprimer tous les éléments NULL dans une liste générique en une seule fois?

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

Disons que certains paramètres sont null; Je ne peux pas savoir à l'avance et je veux les retirer de ma liste afin qu'il ne contienne que des paramètres qui ne sont pas nuls.

Répondre

160

Vous voudrez probablement ce qui suit.

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

Eh oui, cela est la même chose que ma réponse, mais en utilisant la nouvelle syntaxe C# 3 lambda. –

+0

@Mark: J'ai vu les secondes affichées et l'homme était proche (32, 33 et 34). ;) – Lance

+0

Ha :) Eh bien, fair-play - votre réponse a utilisé une syntaxe plus nette donc +1 –

21

La méthode RemoveAll devrait faire l'affaire:

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

Pourquoi ne pas utiliser le lambda? –

+8

Ceci est une réponse de quatre ans. À l'époque C# 3 était relativement nouveau, et j'utilisais encore C# 2 au jour le jour. La syntaxe lambda est maintenant le chemin à parcourir; Cependant, c'est toujours une réponse qui fonctionne, donc je l'ai laissé ici pour toute personne incapable d'utiliser la nouvelle syntaxe (pour une raison quelconque). –

+2

Je n'étais pas au courant que la syntaxe lambda est venue plus tard. Merci pour ton explication! Sans aucun doute, c'est valide. –

28

Je ne connais pas de méthode en construction, mais vous pouvez simplement utiliser LINQ:

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

Cela devrait être évité si 'parameterList' est déjà une liste, car elle créera inutilement une nouvelle copie. Dans ce cas, utilisez la méthode 'RemoveAll' comme d'autres le suggèrent. – Nick

+0

C'est probablement la meilleure option si la collection est un 'Array'. – Andrew

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

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

La méthode OfType() ignore les valeurs nulles:

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

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

D'une certaine manière, c'est une bonne approche, mais cela apporte une surprise au développeur qui pense juste que 'OfType' sélectionne des objets d'un certain type, sans penser qu'il n'inclura pas les valeurs' null' ... Donc je ' Je suis un peu las de l'introduire dans mon propre code. –

+0

@ BjörnAliGöransson Approuvé. C'est une solution intéressante, mais elle ne «lit» pas très clairement. L'utilisation de .RemoveAll avec un lambda conserve tout sur une seule ligne tout en rendant très évident ce que le développeur qui a écrit essayait de réaliser. Cependant, cela peut être utile s'il y a un gain de vitesse qui en vaut la peine. – MattD

1

Facile et sans LINQ:

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

Cette méthode est dans la classe 'List' juste à côté de' RemoveAll', donc je recommanderais celle-ci pour plus de clarté. Si la performance est cruciale, alors vous pouvez suivre cette approche (bien que je supprime les parenthèses et j'ajoute probablement un commentaire pour les développeurs non conscients). – Andrew

+0

@Andrew: selon MSDN, RemoveAll ne prend pas null. Je pense que j'ai aussi testé ça. Un commentaire a du sens cependant. –

+0

'RemoveAll' a reçu un' Predicate', donc vous devriez utiliser 'RemoveAll (x => x == null)', comme indiqué dans la réponse de Mark Bell. – Andrew