Почему я должен использовать любой метод вместо Count?

Возможный дубликат:
Какой метод работает лучше:.Any() vs .Count() > 0?

Мне просто интересно, почему я должен использовать Any() вместо Count()?, если мы взяли msdn пример:

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()??

Ответ 1

Any просто проверяет, содержит ли последовательность, по крайней мере, один элемент, а Count - итерация по всем элементам. Это различие. Классический сценарий, где Any является предпочтительным по сравнению с Count, таков:

if (sec.Count() > 0)

против

if (sec.Any())

Ответ 2

В зависимости от того, какая реализация IEnumerable<> скрывается за интерфейсом, Any может быть значительно быстрее, чем Count. Если, например, на самом деле есть LINQ-to-SQL или какой-либо другой поставщик баз данных, это может быть разница между проверкой таблицы для записи не менее 1 или ее количеством сильная > запись в базе данных.

Однако, на мой взгляд, гораздо более важная причина заключается в том, что с использованием Any() выражает ваш INTENT лучше, чем проверка Count() > 0. Он спрашивает: "Есть ли какие-нибудь предметы?" а не "узнать, сколько предметов есть. Это число больше нуля". Какой вам более естественный перевод "есть ли какие-нибудь предметы?"

Ответ 3

Чтобы получить счет, код должен пройти всю последовательность. В длинных, лениво-исполняемых последовательностях это может занять значительное время. Поскольку я только хочу знать, содержит ли последовательность один или несколько элементов, его вычислительно более эффективно использовать метод расширения Any().

Прочитайте: Блог Эрика Липперта

Также можно прочитать: Свойство Count() и Count

Ответ 4

Собственно, это зависит.

Если ваша коллекция находится в форме IEnumerable, метод Count() будет выполнять итерацию по всем элементам, тогда как Any() не потребуется. Поэтому для перечислений Any() будет иметь (потенциально значительное) преимущество в производительности.

В вашем примере, однако, Pets - это массив, поэтому вам лучше использовать .Length, а не .Count(). В этом случае существенной разницы в производительности не будет.