Linq Any()与MoveNext()的区别

6

在集合上使用Linq,哪种方法最适合查找集合是否为空?

HasChild = Childs.GetEnumerator().MoveNext() ? true : false;

并且

HasChild = Childs.Any() ? true : false;

7
不需要投射真/假值。HasChild = Childs.Any()就可以了。 - Yuval Itzchakov
感谢 @YuvalItzchakov - VIJI
如果你看一下 Any源代码 - 这就是它的作用(尝试 MoveNext)。 - Aleksey L.
1个回答

9

由于IEnumerator<T>实现了IDisposable(因此可能会分配资源),因此通常情况下您不应该只使用简单的一行代码。

// Don't do this: it can cause a resource leakage
HasChild = Childs.GetEnumerator().MoveNext() ? true : false;

但是一个碎片。
bool HasChild = false;

using (var en = Childs.GetEnumerator()) {
  HasChild = en.MoveNext(); // You have no need in ternary operator here
}

在处理Any时,所有你需要做的就是这个似乎显得太啰嗦了

bool HasChild = Childs.Any();

Enumerable<T>.Any 将为您处理冗长的部分:

http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,8788153112b7ffd0

    public static bool Any<TSource>(this IEnumerable<TSource> source) {
        if (source == null) throw Error.ArgumentNull("source");
        using (IEnumerator<TSource> e = source.GetEnumerator()) {
            if (e.MoveNext()) return true;
        }
        return false;
    }

我本以为 Enumerable.Any() 也会检查集合中是否存在 Count,但似乎 Count() 才是这样做的。http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,1165 - kiziu
kiziu: http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,8788153112b7ffd0 - Dmitry Bychenko
是的,我知道,这只是一种观察。如果有人觉得可以从中受益,可能会导致Any的微优化。 - kiziu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接