我有一个自定义集合IList<user>作为用户。当我尝试检查users是否为空或为空时,我没有得到任何智能帮助(例如IsNullOrEmpty),因此我编写了以下扩展方法

public static bool IsNullOrEmpty<T>(this IEnumerable<T> source)
    {
        if (source.IsNullOrEmpty())
        {
            return true;
        }
        return false;
    }


令我惊讶的是,我发现IEnumberable具有IsNullOrEmpty()。

据我所知,IList扩展了ICollection,又扩展了IEnumerable,如果是这种情况,那么IList应该支持IsNullOrEmpty

请更正我错了的地方。

最佳答案

IEnumerable<T>没有IsNullOrEmpty方法,它是您上面编写的扩展名。如果您调用它,则会得到一个StackOverflowException

您可以通过以下方式实现它:

public static bool IsNullOrEmpty<T>(this IEnumerable<T> source)
{
    return source == null || !source.Any();
}


但需要注意的是,这种方法并没有那么有用,甚至可以改善。因为Enumerable.Any将“消耗”查询。因此,如果它不是内存中的集合,则必须调用GetEnumerator并开始枚举它,因此请检查是否至少有一项。有时,如果枚举了该对象,则该对象会变位(如.NET File.ReadLines),如果稍后再次尝试使用它,则会导致该ObjectDisposedException

此方法具有不良副作用的另一个示例是序列是过滤条件(...Where(x => Compute(x, random.Next())))的查询。每次查询可能会产生不同的结果。引用Marc Gravell的评论:“ IEnumerable不应被假定为可重复的”。

在Linq-To-Sql或Linq-To-Entities中,您将在每个IsNullOrEmpty调用中调用数据库。

关于c# - IEnumerable vs Ilist-IsNullOrEmpty扩展方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28276579/

10-13 03:16