Pred Linq sme zvyčajne používali nasledujúcu metódu na určenie, či je kolekcia neprázdna, t. j. či kolekcia obsahuje prvky:
Použitím atribútu Dĺžka alebo Počet nie je problém s vyššie uvedeným písaním.
Ale v ére Linq metóda rozšírenia Enumerable.Count "zjednotila" vlastnosti Dĺžky a Počítania, čo viedlo k nasledujúcemu spôsobu písania na posúdenie nenulity:
Tento text je v poriadku a funguje dobre, ale môže spôsobiť veľmi vážne problémy s výkonom.
Upozorňujeme, že je to možné, nie nevyhnutne, a ak je vyššie uvedená metóda vložená ako pole<T>, zoznam alebo kolekcia<T>, nebude problém.
Kedy sa teda niečo pokazí? Pozrime sa na nasledujúce metódy:
Keď je zavolaný:
Rýchlosť vykonávania bude dosť pomalá a trvalo asi 70 sekúnd, kým môj počítač vykonal zdroj. Count() > 0。
Ak ho analyzujete, zistíte, že výnos return i v riadku 5 kódu GetNums vykonáva int. MaxValue, je to nevyhnutné?
V skutočnosti, pokiaľ vrátime jeden prvok, môžeme usúdiť, že množina nie je prázdna a nie je potrebné vracať všetky prvky.
Ako teda posúdiť? Môžeme použiť metódu rozšírenia Enumerable.Any:
Modifikujte metódu SomeAction nasledovne:
Ak ho zavoláte znova, zistíte, že čas vykonania je zanedbateľný.
Na záver, Count() > 0 bude nevyhnutne mať problémy s výkonom, keď narazí na yeild return.
|