我不得不处理从我的控件中的数据源抛出我的应用程序的数据集合。其中一些集合包含空值,我宁愿在它们点击我的代码时过滤掉它,而不是在整个地方散布空检查代码。我想以可重用的通用方式执行此操作并编写此方法来执行此操作:
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 ...)而不是具体的类型。
答案 0 :(得分:14)
您可以使用LINQ创建一个没有空值的集合副本,而不是从源集合中删除空值:
collection.Where(i => i != null).ToList();
扩展方法适用于任何IEnumerable,包括IList。
答案 1 :(得分: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);
}
}