我喜欢绳子。IsNullOrEmpty方法。我想有一些东西,将允许相同的功能IEnumerable。有这样的东西吗?也许是一些收集助手类?我问的原因是,在if语句中,如果模式是(mylist != null && mylist. any()),代码看起来很混乱。使用Foo.IsAny(myList)会干净得多。

这篇文章没有给出答案:IEnumerable是空的?


当前回答

我使用Bool IsCollectionNullOrEmpty = !(Collection?. any ()??false);。希望这能有所帮助。

分解:

. any()如果Collection为空将返回null,如果Collection为空则返回false。

收集? .Any () ?如果Collection为空,则返回false;如果Collection为空,则返回false。

它的补将得到IsEmptyOrNull。

其他回答

我的做法是,利用一些现代c#特性:

选择1)

public static class Utils {
    public static bool IsNullOrEmpty<T>(this IEnumerable<T> list) {
        return !(list?.Any() ?? false);
    }
}

选择2)

public static class Utils {
    public static bool IsNullOrEmpty<T>(this IEnumerable<T> list) {
        return !(list?.Any()).GetValueOrDefault();
    }
}

顺便说一下,永远不要使用Count == 0或Count() == 0来检查一个集合是否为空。总是使用Linq的.Any()

另一种方法是获取枚举器并调用MoveNext()方法来查看是否有任何项:

if (mylist != null && mylist.GetEnumerator().MoveNext())
{
    // The list is not null or empty
}

这适用于IEnumerable和IEnumerable<T>。

当它是关于引用(可空)类型的,并且项中不期望有空项时,可以使用这一行进行验证

myCollection?.FirstOrDefault() == null

没有自定义助手,我也推荐?.Any() ??. any () == true相对简洁,只需要指定一次序列。


当我想要像对待空集合一样对待一个缺失的集合时,我使用以下扩展方法:

public static IEnumerable<T> OrEmpty<T>(this IEnumerable<T> sequence)
{
    return sequence ?? Enumerable.Empty<T>();
}

这个函数可以与所有LINQ方法和foreach组合,而不仅仅是. any(),这就是为什么我更喜欢它而不是人们在这里提出的更专业的帮助函数。

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