如何一次性删除通用列表中的所有null元素?


112

是否在.Net中为C#定义了默认方法,以删除列表中的所有元素null

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

假设一些参数是null; 我无法事先知道,我想将其从列表中删除,以便仅包含不为null的参数。

Answers:


225

您可能需要以下内容。

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

4
是的,这与我的答案相同,但使用的是更新的C#3 lambda语法。
Mark Bell 2010年

@Mark:我看到了发布的秒数,而它接近了(32、33和34)。;)
Lance 2010年

1
是的...您的答案即使在较旧的版本中也有效,因此+1!在那里,哈!;Þ
兰斯

43

我不知道任何内置方法,但是您可以使用linq:

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

5
如果parameterList已经是列表,则应避免这种情况,因为它将不必要地创建新副本。在这种情况下,请使用RemoveAll其他方法建议的方法。
尼克

如果集合为,则这可能是最佳选择Array
安德鲁

25

RemoveAll方法应该可以解决问题:

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

为什么不使用lambda?
Mike de Klerk 2014年

12
这是一个四岁的答案。当时C#3相对较新,我仍然每天都在使用C#2。现在,lambda语法已成为主流。但是,这仍然是一个可行的答案,因此我将其留给了所有无法使用较新语法的人(无论出于何种原因)。
马克·贝尔

2
我不知道lambda语法稍后出现。谢谢你的解释!毫无疑问,它是有效的。
Mike de Klerk 2014年

8

该方法OfType()将跳过空值:

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

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

从某种意义上说,这是一个很好的方法,但是它给开发人员带来了惊喜,他们只是认为OfType选择某种类型的对象,而不是认为它不会包含null值。因此,我对此有些厌倦。到我自己的代码中。

@BjörnAliGöransson同意。这是一个有趣的解决方案,但是并没有很清楚地“阅读”。在lambda上使用.RemoveAll仍然可以将所有内容保持在一行上,同时对于编写该应用程序的开发人员试图实现的目标非常明显。但是,如果有值得一提的速度优势,这可能会很有用。
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,因此为了清晰起见,我建议您使用该方法。如果性能恰好是至关重要的,那么您可以采用这种方法(尽管我会删除括号,并可能在不知情的情况下为开发人员添加注释)。
Andrew

1
@Andrew:根据MSDN,RemoveAll不为null。我想我也对此进行了测试。评论是有道理的。
Tobias Knauss

1
RemoveAll收到了Predicate,因此您应该使用RemoveAll(x => x == null),如已接受的内容和Mark Bell的回答所示。
安德鲁(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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.