11

重複の可能性:
どちらのメソッドの方がパフォーマンスが優れていますか:.Any()vs .Count()> 0?

msdnの例をとった場合、なぜ?Any()の代わりに使用する必要があるのか​​疑問に思います。Count()

class Pet
{
    public string Name { get; set; }
    public int Age { get; set; }
}
class Person
{
    public string LastName { get; set; }
    public Pet[] Pets { get; set; }
}

public static void AnyEx2()
{
    List<Person> people = new List<Person>
        { new Person { LastName = "Haas",
                       Pets = new Pet[] { new Pet { Name="Barley", Age=10 },
                                          new Pet { Name="Boots", Age=14 },
                                          new Pet { Name="Whiskers", Age=6 }}},
          new Person { LastName = "Fakhouri",
                       Pets = new Pet[] { new Pet { Name = "Snowball", Age = 1}}},
          new Person { LastName = "Antebi",
                       Pets = new Pet[] { }},
          new Person { LastName = "Philips",
                       Pets = new Pet[] { new Pet { Name = "Sweetie", Age = 2},
                                          new Pet { Name = "Rover", Age = 13}} }
        };

    // Determine which people have a non-empty Pet array.
    IEnumerable<string> names = from person in people
                            where person.Pets.AsQueryable().Any()
                            select person.LastName;

    foreach (string name in names)
        Console.WriteLine(name);

    /* This code produces the following output:

       Haas
       Fakhouri
       Philips
    */
}

使用した場合:

  IEnumerable<string> names = from person in people
                            where person.Pets.Count() > 0
                            select person.LastName;

同じ結果になります!、(息切れなどのために作成されたとは思いませんが)、何か機能はありますAny()か?

4

4 に答える 4

19

Anyシーケンスに少なくとも1つの要素が含まれているかどうかを確認するだけで、Countすべての要素を反復処理する必要があります。それが違いです。Any優先される典型的なシナリオCountは次のとおりです。

if (sec.Count() > 0)

vs

if (sec.Any())
于 2012-09-26T13:12:53.763 に答える
7

の実装がインターフェイスの背後に隠れているかどうかによっては、よりもはるかに高速になる可能性があります。たとえば、実際にLINQ-to-SQLまたは他のデータベースプロバイダーが存在する場合、テーブルで少なくとも1つのレコードをチェックすることと、データベース内のすべてのレコードをカウントする必要があることの違いである可能性があります。IEnumerable<>AnyCount

ただし、私の考えでは、はるかに重要な理由は、を使用Any()すると、をチェックするよりも意図がより適切に表現されるためCount() > 0です。「何かありますか?」と聞かれます。「アイテムがいくつあるかを調べます。その数はゼロより大きいですか」ではありません。「何かアイテムはありますか?」のより自然な翻訳はどれですか??

于 2012-09-26T13:19:59.353 に答える
2

カウントを取得するには、コードがシーケンス全体をトラバースする必要があります。長くて怠惰に実行されたシーケンスでは、これにはかなりの時間がかかる可能性があります。シーケンスに1つ以上の要素が含まれているかどうかだけを知りたいので、Any()拡張メソッドを使用する方が計算上効率的です。

読むEricLippertのブログ

読むのもuserfullCount()とCountプロパティ

于 2012-09-26T13:14:04.257 に答える
2

実は状況によります。

コレクションがIEnumerableの形式である場合、Count()メソッドはすべての要素を反復処理しますが、Any()は反復処理する必要はありません。したがって、列挙型の場合、Any()には(潜在的に重要な)パフォーマンス上の利点があります。

ただし、この例では、Petsは配列であるため、.Count()ではなく.Lengthを使用することをお勧めします。その場合、パフォーマンスに大きな違いはありません。

于 2012-09-26T13:20:11.787 に答える