4

我不得不处理从我无法控制的数据源向我的应用程序抛出的数据集合。其中一些集合包含空值,我宁愿在它们命中我的代码时立即过滤掉它们,而不是将空值检查代码分散在各处。我想以可重用的通用方式执行此操作,并编写了此方法来执行此操作:

    public static void RemoveNulls<T>(this IList<T> collection) where T : class
    {
        for (var i = 0; i < collection.Count(); i++)
        {
            if (collection[i] == null)
                collection.RemoveAt(i);
        }
    }

我知道在具体的 List 类中有RemoveAll()可以使用的方法,例如:

collection.RemoveAll(x => x == null);

但是很多返回类型是基于接口的(IList/IList ...)而不是具体类型。

4

2 回答 2

20

您可以使用 LINQ 创建没有空值的集合副本,而不是从源集合中删除空值:

collection.Where(i => i != null).ToList();

扩展方法适用于任何 IEnumerable,包括 IList。

于 2013-05-01T15:22:08.153 回答
4

您的方法将不起作用,因为删除一个元素会导致所有后续元素的索引减少。如果您不想要 Linq 解决方案(这似乎最简单:请参阅@alex 的答案),您应该向后迭代。

public static void RemoveNulls<T>(this IList<T> collection) where T : class
{
    for (var i = collection.Count-1; i >= 0 ; i--)
    {
        if (collection[i] == null)
            collection.RemoveAt(i);
    }
}
于 2013-05-01T15:25:54.210 回答