Pred Linqom smo običajno uporabljali naslednjo metodo za ugotavljanje, ali je zbirka neprazna, tj. zbirka vsebuje elemente:
Z uporabo atributa Dolžina ali Število ni težav z zgornjim pisanjem.
Vendar pa je v Linqovi dobi metoda razširitve Enumerable.Count "združila" lastnosti dolžine in štetja, kar je privedlo do naslednjega načina pisanja za presojo ne-ničelnosti:
To pisanje je v redu in deluje, vendar lahko povzroči zelo resne težave z zmogljivostjo.
Upoštevajte, da je to mogoče, ne nujno, in če se zgornja metoda prenese kot Array<T>, List ali Collection<T>, ne bo težav.
Kdaj bo torej šlo kaj narobe? Poglejmo si naslednje metode:
Ko je poklican:
Hitrost izvajanja bo precej počasna, moj računalnik je za izvedbo vira potreboval približno 70 sekund. Count() > 0。
Če jo analizirate, boste ugotovili, da yield return i v vrstici 5 kode GetNums izvaja int. MaxValue, ali je to potrebno?
Pravzaprav, dokler vrnemo en element, lahko zaključimo, da je množica neprazna in ni potrebe, da bi vrnili vse elemente.
Kako torej presoditi? Uporabimo lahko metodo Enumerable.Any extension:
Metodo SomeAction spremenite na naslednji način:
Če ga pokličete še enkrat, boste ugotovili, da je čas izvedbe zanemarljiv.
Za povzetek, Count() > 0 bo neizogibno imel težave z zmogljivostjo, ko bo naletel na yeild return.
|