gpt4 book ai didi

c# - IEnumerable 与 Ilist - IsNullOrEmpty 扩展方法

转载 作者:太空宇宙 更新时间:2023-11-03 21:24:16 26 4
gpt4 key购买 nike

我有一个自定义集合 IList<user>作为用户。当我试图检查是否 users为 null 或空,我没有得到任何情报帮助(如 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 <= 4 中的 File.ReadLines),该对象将被删除,这将导致 ObjectDisposedException。如果您稍后尝试再次使用它。

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

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

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

26 4 0