2012-03-03 17 views
9

enter image description hereIEnumerableの複数の列挙が可能ですか?

なぜですか?どうすれば修正できますか?

+1

最終的なスクリーンショットとテキストを除いて、すべてが本物の質問から気をそらすだけです。 – usr

+1

これはhttp://stackoverflow.com/q/7244178/219583と非常によく似ています。 Any()は1つの列挙としてカウントし、Aggregate()は2番目の列挙としてカウントします。 –

+9

コードをスクリーンショットとして投稿しないでください。ソースを質問に貼り付けてください。 – Joe

答えて

14

ここには何も修正はありません。 Any()は列挙を反復しますが、最初の要素の後で停止します(その後、trueを返します)。

  • パフォーマンス:

    複数の列挙は、主に2つの場合に問題とされている一般的には、複数回の繰り返しを避けたい場合 ことができ、それが遅いため。 Any() 少なくとも1つの要素があることを確認して、あなたに必要なチェックであるので、これはここには当てはまりません。また、メモリ内のシーケンスだけで、リモート/外部リソースにアクセスすることもありません。

  • 2回以上反復できない列挙型: などをネットワークから受信しています - ここでも適用されません。唯一あなたが次の操作を行うことができたら、繰り返し処理する必要のある非LINQのバージョンとして

bool foundAny= false; 
bool isEqual = true; 

if(f == null) 
    throw new ArgumentException(); 

foreach(var check in f) 
{ 
    foundAny = true; 
    isEqual = isEqual && check(p,p2); 
} 

if(!foundAny) 
    throw new ArgumentException(); 

return isEqual; 

する。しかし、述べたように、あなたのケースでは、それは違いはありませんし、Iあなたにもっと読みやすいバージョンで行くだろう。

+1

これはデータベースクエリであれば、通常は完全に2回実行されます。 – usr

+1

@usr:合意しました。最初のケースに追加しました。リモート/外部リソースかメモリ内シーケンスかどうかに違いがあります – BrokenGlass

5

の列挙は、結果を特定する別の方法がない場合に発生する可能性があります。場合によっては、たとえばIEnumerable<T>インスタンスが実際にIQueryable<T>で、データベースクエリまたはWebサービス呼び出しを実行させるような問題があります。さて、それが単なるメモリ内のコレクションであれば、コレクションを列挙しても目立った副作用がないので、実際には問題にはなりません。とにかくAnyは、配列がICollection<T>を実装する場合はCountプロパティを使用するため、列挙は発生しません。

関連する問題