Почему я должен использовать любой метод вместо 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(). В этом случае существенной разницы в производительности не будет.