2010-06-18 13 views
78

Czy istnieje metoda domyślna zdefiniowana w .Net dla języka C#, aby usunąć wszystkie elementy z listy, które są null?Jak za jednym razem usunąć wszystkie elementy puste z ogólnej listy?

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

Powiedzmy niektóre parametry są null; Nie wiem z góry i chcę je usunąć z mojej listy, aby zawierała tylko parametry, które nie są zerowe.

Odpowiedz

160

Prawdopodobnie będziesz potrzebować następujących rzeczy.

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

Tak, to jest takie samo jak moją odpowiedź, ale stosując nowszą C# 3 składni lambda. –

+0

@ Mark: Widziałem opublikowane sekundy i człowieka było blisko (32, 33 i 34). ;) – Lance

+0

Ha :) No cóż, fair play - Twoja odpowiedź posłużyła prostszą składnią, więc +1 –

21

Sposób removeAll powinno załatwić sprawę:

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

Dlaczego nie używać lambda? –

+8

To jest odpowiedź czterech lat. W tym czasie C# 3 było stosunkowo nowe i ciągle używałem C# 2 na co dzień. Składnia lambda jest teraz drogą do zrobienia; Jednak nadal jest to działająca odpowiedź, więc zostawiłem ją tutaj dla każdego, kto nie może użyć nowszej składni (z jakiegokolwiek powodu). –

+2

Nie wiedziałem, że składnia lambda pojawiła się później. Dziękuję za wyjaśnienie! Bez wątpienia jest ono ważne. –

28

ja nie znam żadnego sposobu wbudowanym, ale można po prostu użyć LINQ:

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

Należy tego unikać, jeśli 'parameterList' jest już listą, ponieważ niepotrzebnie utworzy nową kopię. W takim przypadku użyj metody "RemoveAll", jak sugerują inni. – Nick

+0

Jest to prawdopodobnie najlepsza opcja, jeśli kolekcja jest 'Tablicą'. – Andrew

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

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

Metoda OfType() pominie wartości puste:

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

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

W pewnym sensie jest to dobre podejście, ale zaskakuje programistę, który uważa, że ​​'OfType' wybiera obiekty określonego typu, nie myśląc, że nie będzie zawierać wartości' null' ... Jestem trochę zmęczony, aby wprowadzić to do mojego własnego kodu. –

+0

@ BjörnAliGöransson Uzgodnione. To interesujące rozwiązanie, ale nie "czyta" bardzo wyraźnie. Użycie .RemoveAll z lambdą nadal utrzymuje wszystko w jednym wierszu, czyniąc to naprawdę oczywistym, co starał się osiągnąć programista, który to napisał. Może to jednak być przydatne, jeśli warto skorzystać z prędkości. – MattD

1

Łatwy i bez LINQ:

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

Ta metoda znajduje się w klasie "List" tuż obok 'RemoveAll', więc polecam tę dla jasności. Jeśli wydajność okazała się kluczowa, możesz użyć tego podejścia (chociaż usunąłbym nawiasy i prawdopodobnie dodałem komentarz dla programistów nieświadomych). – Andrew

+0

@Andrew: zgodnie z MSDN, RemoveAll nie przyjmuje wartości null. Myślę, że również to przetestowałem. Komentarz ma jednak sens. –

+0

'RemoveAll' otrzymał' Predykat', więc powinieneś użyć 'RemoveAll (x => x == null)', jak widać w odpowiedzi przyjętej i Mark Bell. – Andrew

Powiązane problemy