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

pen*_*ake 105 c# null element list

在.Net中为C#定义了一个默认方法来删除列表中的所有元素null吗?

List<EmailParameterClass> parameterList = new List<EmailParameterClass>{param1, param2, param3...};
Run Code Online (Sandbox Code Playgroud)

让我们说一些参数是null; 我事先无法知道,我想从列表中删除它们,以便它只包含非null的参数.

Lan*_*nce 207

你可能想要以下内容.

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

  • 是的,这与我的答案相同,但使用较新的C#3 lambda语法. (3认同)

Pau*_*les 39

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

parameterList = parameterList.Where(x => x != null).ToList();
Run Code Online (Sandbox Code Playgroud)

  • 如果`parameterList`已经是List,则应避免这种情况,因为它将不必要地创建新副本.在这种情况下,使用其他人建议的`RemoveAll`方法. (5认同)

Mar*_*ell 25

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

parameterList.RemoveAll(delegate (object o) { return o == null; });
Run Code Online (Sandbox Code Playgroud)

  • 这是一个四年前的答案.当时C#3相对较新,而且我还在日常使用C#2.lambda语法现在是要走的路; 但是,这仍然是一个有效的答案,所以我把它留给了那些无法使用新语法的人(无论出于何种原因). (11认同)
  • 我不知道lambda语法后来出现了.谢谢你的解释!毫无疑问,它是有效的. (2认同)

Rya*_*ato 12

还有另一个简单而优雅的选择:

parameters.OfType<EmailParameterClass>();
Run Code Online (Sandbox Code Playgroud)

这将删除所有非 type 的元素,EmailParameterClass这显然会过滤掉任何 type 的元素null

这是一个测试:

class Program
{
    class Test { }

    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();
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 7

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

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

IList<EmailParameterClass> parameterList_notnull = 
    parameterList.OfType<EmailParameterClass>();
Run Code Online (Sandbox Code Playgroud)

  • 在某种程度上,这是一个很好的方法,但它给开发人员带来了惊喜,他们只是认为 `OfType` 选择某种类型的对象,而不认为它不会包含 `null` 值......所以我有点厌倦将其引入我自己的代码中。 (2认同)