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

Posted

技术标签:

【中文标题】如何一次性删除通用列表中的所有空元素?【英文标题】:How to remove all the null elements inside a generic list in one go? 【发布时间】:2011-03-05 10:15:23 【问题描述】:

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

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

假设一些参数是null;我无法提前知道,我想将它们从我的列表中删除,以便它只包含不为空的参数。

【问题讨论】:

【参考方案1】:

您可能需要以下内容。

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

【讨论】:

是的,这与我的答案相同,但使用了较新的 C#3 lambda 语法。 @Mark:我看到了发布的秒数,而且很接近(32、33 和 34)。 ;) 是的......你的答案即使在旧版本中也有效,所以+1!所以,哈! ;Þ 我会在清理后的末尾添加 .Cast() 和 .Cast() ,这会将 List 的类型更改为 List【参考方案2】:

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

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

【讨论】:

为什么不使用 lambda? 这是一个四年前的答案。当时 C# 3 相对较新,而我仍在日常使用 C# 2。 lambda 语法现在是要走的路;然而,这仍然是一个有效的答案,所以我把它留在这里给任何无法使用新语法的人(无论出于何种原因)。 我不知道 lambda 语法是后来出现的。谢谢你的解释!毫无疑问,它是有效的。【参考方案3】:

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

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

【讨论】:

如果parameterList 已经是一个列表,则应该避免这种情况,因为它会不必要地创建一个新副本。在这种情况下,请按照其他人的建议使用 RemoveAll 方法。 如果集合是Array,这可能是最好的选择。【参考方案4】:
List<EmailParameterClass> parameterList = new List<EmailParameterClass>param1, param2, param3...;

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

【讨论】:

【参考方案5】:

OfType() 方法将跳过空值:

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

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

【讨论】:

从某种意义上说,这是一个很好的方法,但它给只是认为OfType选择了某种类型的对象,而不认为它不会包含null的开发人员带来了惊喜values ... 所以我有点厌倦将它引入我自己的代码中。 @BjörnAliGöransson 同意。这是一个有趣的解决方案,但它并没有很清楚地“阅读”。使用带有 lambda 的 .RemoveAll 仍然可以将所有内容保留在一行中,同时让编写它的开发人员试图实现的目标变得非常明显。但是,如果有值得的速度优势,这可能会很有用。 这个解决方案最酷的地方在于,它会改变 T? 的泛型参数?到T。【参考方案6】:

简单且无需 LINQ:

while (parameterList.Remove(null)) ;

【讨论】:

该方法在List 类中,就在RemoveAll 旁边,因此为了清楚起见,我建议使用该方法。如果性能恰好至关重要,那么您可以采用这种方法(尽管我会删除括号并可能为不知情的开发人员添加评论)。 @Andrew:根据 MSDN,RemoveAll 不取 null。我想我也对此进行了测试。不过,评论是有道理的。【参考方案7】:

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

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 的值? 它肯定会,我添加了测试器供您娱乐。 这很棒,尤其是在使用可空注释时,因为它不仅过滤掉空值,而且将其强制转换为不可空类型(例如,Bitmap?[] 变为 Bitmap[]

以上是关于如何一次性删除通用列表中的所有空元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除数组中的所有空数组

如何递归删除PowerShell中的所有空文件夹?

当行不消失时删除data.frame中的所有空列和行

如何将默认值 0 赋予 Handsontable 中的所有空单元格?

如何避免 Jaxb XML 中的所有空标签

如何一次更新所有JavaFX元素?