List <T>的通用扩展方法不会删除null

时间:2019-12-17 23:23:52

标签: c# linq extension-methods

我正在尝试一种非常简单的扩展方法,该方法只是从列表中删除空值。

它看起来像这样:

private static List<T> RemoveNulls<T>(this List<T> list) where T : new()
{
    List<T> newList = list.FindAll(x => x != null);
    return newList;
}

真的很简单。我这样称呼它:

foundNeighbors.RemoveNulls();

但是,有时我仍然会返回一个包含null的列表。这应该是不可能的吗?我是否缺少有关扩展方法的内容?

2 个答案:

答案 0 :(得分:4)

您的扩展方法创建并返回一个没有空值的全新列表,它不会变异调用对象。

改为使用它:

foundNeighbors = foundNeighbors.RemoveNulls();

答案 1 :(得分:4)

这是个人喜好,但我可以建议

public static class ListExt
{
    public static void RemoveNulls<T>(this List<T> list)
        where T : new()
    {
        list.RemoveAll(t => t == null);
    }
}

它不使用任何额外的内存,并且仅更改list实例,这是我在问题和评论中看到的,这是您要实现的目标。

以后您可以根据需要使用它

foundNeighbors.RemoveNulls();

就像我说的那样,这将直接更改foundNeighbors

@Edit:就像其他人注意到的那样,如果您希望它更快(O(N)),则应改用RemoveAll