Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IEnumerable与Ilist-IsNullOrEmpty扩展方法_C#_Extension Methods_Ienumerable_Ilist_Isnullorempty - Fatal编程技术网

C# IEnumerable与Ilist-IsNullOrEmpty扩展方法

C# IEnumerable与Ilist-IsNullOrEmpty扩展方法,c#,extension-methods,ienumerable,ilist,isnullorempty,C#,Extension Methods,Ienumerable,Ilist,Isnullorempty,我有一个用户自定义集合。当我试图检查用户是否为null或空时,我没有得到任何智能帮助,比如IsNullOrEmpty,所以我编写了下面的扩展方法 public static bool IsNullOrEmpty<T>(this IEnumerable<T> source) { if (source.IsNullOrEmpty()) { return true; } return

我有一个用户自定义集合。当我试图检查用户是否为null或空时,我没有得到任何智能帮助,比如IsNullOrEmpty,所以我编写了下面的扩展方法

public static bool IsNullOrEmpty<T>(this IEnumerable<T> source)
    {
        if (source.IsNullOrEmpty())
        {
            return true;
        }
        return false;
    }
令我惊讶的是,我发现IEnumberable已为空

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

请纠正我的错误。

IEnumerable没有IsNullOrEmpty方法,它是您上面编写的扩展。如果你叫它,你会得到一个StackOverflowException

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

public static bool IsNullOrEmpty<T>(this IEnumerable<T> source)
{
    return source == null || !source.Any();
}
但值得注意的是,这种方法并没有太大的帮助,甚至可能会变得更糟。因为可枚举。任何将使用查询。因此,如果它不是内存中的集合,则必须调用GetEnumerator并开始枚举它,以便检查是否至少有一个项。有时,该对象将被隔离,以防像.NET Computex中的File.ReadLines、random.Next那样被枚举。每次查询都可能产生不同的结果。引用Marc Gravell的评论:IEnumerable不应该被认为是可重复的

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

IEnumerable没有IsNullOrEmpty方法,它是您上面编写的扩展。如果你叫它,你会得到一个StackOverflowException

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

public static bool IsNullOrEmpty<T>(this IEnumerable<T> source)
{
    return source == null || !source.Any();
}
但值得注意的是,这种方法并没有太大的帮助,甚至可能会变得更糟。因为可枚举。任何将使用查询。因此,如果它不是内存中的集合,则必须调用GetEnumerator并开始枚举它,以便检查是否至少有一个项。有时,该对象将被隔离,以防像.NET Computex中的File.ReadLines、random.Next那样被枚举。每次查询都可能产生不同的结果。引用Marc Gravell的评论:IEnumerable不应该被认为是可重复的


在Linq To Sql或Linq To Entities中,每次IsNullOrEmpty调用时都要调用数据库。

注释IEnumerable中提到的@Marc GRACE不应被认为是可重复的。假设您的源IEnumerable是从datareader创建的。您只有一次机会重复它。如果您只是为了查看它是否为空而使用了唯一的机会,那么您将无法再次访问记录。如果需要IList而不是IEnumerable,也许您希望编写一个扩展方法


正如注释中提到的@Marc Gra砾,IEnumerable不应被认为是可重复的。假设您的源IEnumerable是从datareader创建的。您只有一次机会重复它。如果您只是为了查看它是否为空而使用了唯一的机会,那么您将无法再次访问记录。如果需要IList而不是IEnumerable,也许您希望编写一个扩展方法


IEnumerable没有IsNullOrEmpty方法,它是您在上面编写的扩展;如果你称之为StackOverflowException,你会得到一个StackOverflowException。@TimSchmelter:D谢谢你作为旁注:IEnumerable不应该被认为是可重复的;测试序列是否为空的唯一方法是开始迭代它:如果开始迭代它,那么它可能已经死了、完成了、消失了、完成了,再也看不到了again@MarcGravell您能解释一下repeatable是什么意思吗?@Tech repatable==您可以多次查询数据并得到相同的结果;如果该数据是网络套接字上的开放流,例如:您只能读取它一次-一旦您读取了它:它就消失了。另一个简单的例子是:我可以编写一个IEnumerable,它根据加密种子生成随机数:完全不可重复。IEnumerable没有IsNullOrEmpty方法,它是您上面编写的扩展;如果你称之为StackOverflowException,你会得到一个StackOverflowException。@TimSchmelter:D谢谢你作为旁注:IEnumerable不应该被认为是可重复的;测试序列是否为空的唯一方法是开始迭代它:如果开始迭代它,那么它可能已经死了、完成了、消失了、完成了,再也看不到了again@MarcGravell您能解释一下repeatable是什么意思吗?@Tech repatable==您可以多次查询数据并得到相同的结果;如果该数据是网络套接字上的开放流,例如:您只能读取它一次-一旦您读取了它:它就消失了。另一个简单的例子是:我可以编写一个IEnumerable,它根据加密种子生成随机数:完全不可重复。我希望C和VB.NET有foreach构造,可以接受枚举器上的模式,而不是只能够接受GetEnumerator方法。只能读取一次的对象应该是枚举数,而不是枚举数。由于语言无法处理前者,它们不得不假装成后者 hat可以接受以枚举数为模式的内容,而不仅仅是使用GetEnumerator方法接受内容。只能读取一次的对象应该是枚举数,而不是枚举数。由于语言无法与前者合作,他们不得不假装成后者。