我有一个自定义集合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/