2

最近、使用しているコードベースに少しコードがあり、ReSharperがそれをにリファクタリングすることを提案しましたcollection.Any(Func< bool >)

これがパフォーマンスに与える影響について疑問に思っています。次のような電話があるとします。

bool hasEvenValue = collection.Any(i => (i % 2) == 0);

...そしてこのようなデータ...

{ 1, 2, 3, 5, 3, 5, 1, 3, 5, 2 }

Enumerable.Any()はいつ値を返しますか?2番目のデータ要素、またはこの場合、trueを返す前にすべての要素を処理しますか?

4

4 に答える 4

5

一致する要素が見つかるとすぐに戻ります。一致しない要素がない場合は、シーケンス全体を処理します。

そのため、使用するよりも優れています.Count(...) != 0(より読みやすく、意味的に意味があります)。

于 2012-08-23T21:43:07.537 に答える
2

IEnumerable<T>.Any(...)(dotKeepでコンパイルされていない)の実装は次のとおりです。

public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
  if (source == null)
    throw Error.ArgumentNull("source");
  if (predicate == null)
    throw Error.ArgumentNull("predicate");
  foreach (TSource source1 in source)
  {
    if (predicate(source1))
      return true;
  }
  return false;
}

したがって、基本的には、アイテムが条件を満たすとすぐに戻ります。

于 2012-08-23T21:45:00.293 に答える
1

IEnumerable.Any(Func)はいつ値を返しますか?

実行は延期されないため、実行されると常にすぐに実行されます。シーケンス内の要素の1つが指定された述語に対してtrueを返すかどうかを示すブール値を返します。したがって、とは異なり、クエリ全体を実行する必要はありませんCount

于 2012-08-23T21:44:17.300 に答える
1

Anyこれは、オペレーターが最初の一致に達した後に終了することを示すために、LINQPadで作成したコードです。

void Main()
{
    Console.WriteLine("Are there any evens? " + YieldEvenThenThrowEnumerable().Any(i => i % 2 == 0));
    Console.WriteLine("still running");
    Console.WriteLine("Are there any odds? " + YieldEvenThenThrowEnumerable().Any(i => i % 2 == 1));
    Console.WriteLine("never reaches this point");
}

IEnumerable<int> YieldEvenThenThrowEnumerable()
{
    yield return 2;
    throw new InvalidOperationException("TEST");
}

どの出力:

偶数はありますか?
True
はまだ実行中
<この時点でenumerableからInvalidOperationExceptionがスローされます>

「もしあれば」をテストする最初のAny呼び出しが列挙可能なもの全体を歩いた場合、プログラムはメッセージを表示せずに終了します。2番目の呼び出しは、「奇数の場合」テストがリスト全体をウォークし、例外がスローされることを示すために行われました。

于 2012-08-26T02:18:48.213 に答える