在集合上使用Linq,哪种方法最适合查找集合是否为空?
HasChild = Childs.GetEnumerator().MoveNext() ? true : false;
并且
HasChild = Childs.Any() ? true : false;
由于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 - kiziuAny
的微优化。 - kiziu
HasChild = Childs.Any()
就可以了。 - Yuval ItzchakovAny
的 源代码 - 这就是它的作用(尝试MoveNext
)。 - Aleksey L.