2012-03-14 10 views

答えて

6

Anyメソッドは必要な要素の最小数だけを反復します。すぐにそれが一致する要素を見つけると、それはすぐに

を返します。これは、

public static bool Any<T>(this IEnumerable<T> enumerable, Func<T, bool> predicate) { 
    foreach (var cur in enumerable) { 
    if (predicate(cur)) { 
     return true; 
    } 
    } 
    return false; 
} 

最悪の場合(noneまたは最後に一致)で、それはすべての要素を訪問すると、次のように大まかにが実装です。最高の場合(最初のマッチング)、それは訪問するだけです

+0

私はそれが事実であったことを期待していました、ありがとう。私はもともと 'Count()> 0'を使用していて、非常に高価な操作であることに気付きました。私は 'Any'を再発見してどこにでも使っています:) – Jordan

2

後者 - ReSharperでコードを見て、体験版をダウンロードした場合に確認できます。

Anyが効率的かどうかについては、たとえば、代わりにCountプロパティを使用できます。しかし、間違いなく意図をうまく表現しています。

+0

IEnumerable が実際にリストの場合、Count()はリストのCountプロパティを使用しますか? – Jordan

+0

それは本当ですが、私はまだ実現されていない配列で作業しています。実際、私は 'Enumerable'を補うためのメソッドの汎用ライブラリを書いています。だから私は 'IEnumerable 'を実装している点を除いて、与えられたシーケンスが何であるか分かりません。私はもちろん、私は上記に尋ねてきた理由を尋ねることができます。 'List 'と 'Count'や' Length'プロパティを持つ他の型の特別な場合が必要かどうか疑問です。 – Jordan

+1

まだ実現されていないシーケンスで作業している場合は、それらが繰り返し可能かどうかを確認してください。 'Any'はシーケンスを実行するためにシーケンスの要素を読み込まなければならないので、反復不可能なシーケンスに適用するときは注意が必要です。そうしないと、最初の要素が失われます。私は実際にそれが助けになる場合にこれを見ていた:http://stackoverflow.com/questions/9194908/safely-checking-non-repeatable-ienumerables-forempty –

1

Anyは、述部との一致が成功するとすぐにtrueを返します。存在しない場合は、コレクション全体で反復されます。

関連する問題