如何一次性删除通用列表中的所有空元素?
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!所以,哈! ;Þ 我会在清理后的末尾添加 .CastRemoveAll 方法应该可以解决问题:
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[]
)以上是关于如何一次性删除通用列表中的所有空元素?的主要内容,如果未能解决你的问题,请参考以下文章