Opublikowany wcześniej question dał mi do myślenia. Czy Any()
i Count()
działają podobnie, gdy są używane na pustej liście?C#: Dowolny() kontra Count() dla pustej listy
Zgodnie z objaśnieniami here, obie powinny wykonać te same kroki, co GetEnumerator()/MoveNext()/Dispose()
.
Testowałem to przy użyciu szybki program na LINQPad:
static void Main()
{
var list = new List<int>();
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < 10000; i++)
list.Any();
stopwatch.Stop();
Console.WriteLine("Time elapsed for Any() : {0}", stopwatch.Elapsed);
stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < 10000; i++)
list.Count();
stopwatch.Stop();
Console.WriteLine("Time elapsed for Count(): {0}", stopwatch.Elapsed);
}
i ogólny wynik wydaje się wskazywać, że Count()
jest szybszy w tej sytuacji. Dlaczego?
Nie jestem pewien, czy uzyskałem właściwy wynik, byłbym wdzięczny za wszelkie poprawki, jeśli nie.
Edycja: Rozumiem, że miałoby to więcej sensu semantycznie. Pierwszy link opublikowany w pytaniu pokazuje sytuację, w której ma sens użycie bezpośrednio od Count()
, ponieważ wartość zostanie wykorzystana, stąd pytanie.
Oni obaj bardzo szybko, ale jeśli testowanie 'List' wystarczy użyć' własność Count', zamiast 'Count()' rozszerzenie, które nie wymaga wyliczenia. – Jodrell
Co dokładnie wykazały testy? Spodziewam się, że wywoływanie któregokolwiek z nich zaledwie 10000 razy będzie tak szybkie, że nie da się tego zmierzyć. –
Powód "Any" jest ogólnie lepszy, ponieważ wystarczy znaleźć jedną rzecz w wyliczeniu, ale liczba musi znaleźć wszystkie z nich. W teście lista jest pusta, więc najwyraźniej znajduje pierwszą, a znalezienie wszystkiego nie robi wielkiej różnicy. –