ジェネリックリスト内のすべてのnull要素を一度に削除する方法は?


112

.NetでC#用に定義されたデフォルトのメソッドはありますnullか?

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

パラメータのいくつかがであるとしましょうnull。私は事前に知ることができず、それらをリストから削除して、nullではないパラメーターのみが含まれるようにします。

回答:


225

おそらく次のものが必要でしょう。

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

4
はい、これは私の答えと同じですが、新しいC#3ラムダ構文を使用しています。
Mark Bell、

@Mark:投稿された秒数とそれが近い人(32、33、34)を見ました。;)
ランス、

1
ええと...まああなたの答えは古いバージョンでもうまくいくので+1してください!だから、ハ!;Þ
ランス

43

組み込みのメソッドは知りませんが、linqを使用できます。

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

5
parameterListがすでにリストである場合、これは不必要に新しいコピーを作成するため、これは避けてください。その場合RemoveAll、他の人が提案する方法を使用してください。
Nick

コレクションがの場合、これはおそらく最良のオプションですArray
Andrew

25

RemoveAllメソッドは、トリックを実行する必要があります。

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

なぜラムダを使わないのですか?
Mike de Klerk 2014年

12
これは4年前の答えです。当時C#3は比較的新しいものであり、私はまだC#2を日常的に使用していました。ラムダ構文は今や進むべき道です。ただし、これはまだ有効な答えなので、(何らかの理由で)新しい構文を使用できない人のためにここに残しました。
Mark Bell

2
ラムダ構文が後で登場することは知りませんでした。説明ありがとうございます!間違いなく有効です。
Mike de Klerk 2014年

8

メソッドOfType()はnull値をスキップします。

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

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

ある意味で、これは良いアプローチですがOfTypenull値が含まれないとは考えずに、特定のタイプのオブジェクトを選択することだけを考える開発者に驚きをもたらします...私自身のコードに。

@BjörnAliGöransson同意します。これは興味深い解決策ですが、非常にはっきりと「読み取る」ことができません。ラムダで.RemoveAllを使用しても、すべてを1行で保持しながら、それを書いた開発者が何を達成しようとしていたかを明確に示します。ただし、これは価値のある速度の利点がある場合に役立ちます。
MattD

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

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

2

簡単でLINQなし:

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

そのメソッドはのListすぐ隣のクラスRemoveAllにあるので、わかりやすくするためにこのメソッドをお勧めします。パフォーマンスが非常に重要である場合は、このアプローチを使用できます(ただし、角かっこを削除し、おそらく気付かない開発者にコメントを追加します)。
アンドリュー

1
@Andrew:MSDNによれば、RemoveAllはnullを取りません。私もそれをテストしたと思います。コメントは意味があります。
Tobias Knauss

1
RemoveAllを受け取ったPredicateのでRemoveAll(x => x == null)、受け入れられたマークベルの回答に示されているように、を使用する必要があります。
Andrew

1

別のシンプルでエレガントなオプションがあります:

parameters.OfType<EmailParameterClass>();

これにより、タイプEmailParameterClassではないすべての要素が削除され、タイプの要素が明らかに除外されますnull

ここにテストがあります:

class Test { }
class Program
{
    static void Main(string[] args)
    {
        var list = new List<Test>();
        list.Add(null);
        Console.WriteLine(list.OfType<Test>().Count());// 0
        list.Add(new Test());
        Console.WriteLine(list.OfType<Test>().Count());// 1
        Test test = null;
        list.Add(test);
        Console.WriteLine(list.OfType<Test>().Count());// 1
        Console.ReadKey();
    }
}

これは機能しますか?まだタイプの要素参照にはなりませんEmailParameterClass、値はnull
derHugo

それは間違いなく、私はあなたの娯楽のためにテスターを追加しました。
Ryan Naccarato
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.