2016-09-26 18 views
6

コレクションでLinqを使用していますが、コレクションが空でないことを確認するのに最適ですか?Linq Any()vs MoveNext()

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

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

不要true/falseを投影する。 'HasChild = Childs.Any()'が行います。 –

+0

ありがとう@YuvalItzchakov – VIJI

+0

「Any」の[ソースコード](http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,1165)を見てみると(MoveNext'を試してみてください) –

答えて

8

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; 
    } 
+0

Enumerable.Any()もコレクションに 'Count'の存在をチェックしていると誓っていたかもしれませんが、' Count() 'がそうしているようです。 http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs,1165 – kiziu

+0

kiziu:http://referencesource.microsoft.com/#System.Core/System/Linq/Enumerable.cs、 8788153112b7ffd0 –

+0

はい、私は知っている、ただの観測です。誰かが恩恵を受ける可能性があると感じる場合、おそらく「Any」の微視的最適化につながる可能性があります。 – kiziu

関連する問題