检查通用IEnumerable是否为空

K M*_*hta 4 c# linq generics

假设我有一个可能类型的对象IEnumerable<T>.我想写一个方法,如果对象是类型IEnumerable<T>,不是null,并且不为空,则返回true .

这是我到目前为止所得到的:

public bool IsNullOrEmpty(object obj)
{
    if (obj != null)
    {
        if (obj is IEnumerable<object>)
        {
            return (obj as IEnumerable<object>).Any();
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

如果我传入一个类型的对象List<string>,但是如果我传入一个类型的对象则不行List<int>.失败是因为因为obj is IEnumerable<object>回归false.

知道如何让所有通用IEnumerables工作吗?

TyC*_*obb 11

由于类型可能是未知的,您可以尝试检查IEnumerable接口并MoveNext()在枚举器上使用.

编辑:我更新了方法名称.由于原始问题代码检查集合中是否有项目,因此现在使用逻辑更有意义.

public bool IsNotNullOrEmpty(object enumerable)
{
    if (enumerable != null)
    {
        if (enumerable is IEnumerable)
        {
            using(var enumerator = ((IEnumerable)enumerable).GetEnumerator())
                return enumerator.MoveNext();
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

  • 你不能在`object`上调用它. (2认同)

O. *_*per 9

System.Collections.Generic.IEnumerable<T>继承System.Collections.IEnumerable- 因此,如果你可以检查非泛型IEnumerable,而不是泛型IEnumerable<T>,你可以只是转换为IEnumerable.

关于你的代码的一些注意事项:你首先检查is,然后你投了as.这通常是不必要的; 如果演员表失败,as已经检查并返回null.因此,更短的方法是:

var enumerable = obj as IEnumerable;
if (enumerable != null) {
    return !enumerable.Cast<object>().Any();
}
Run Code Online (Sandbox Code Playgroud)

请注意,您需要额外的呼叫Cast,因为Any需要通用IEnumerable<T>.