Prieš "Linq" paprastai naudojome šį metodą, kad nustatytume, ar kolekcija nėra tuščia, t. y. kolekcijoje yra elementų:
Naudojant atributą Ilgis arba Skaičius, nėra jokių problemų su aukščiau pateiktu rašymu.
Tačiau Linq eroje Enumerable.Count išplėtimo metodas "suvienijo" Length ir Count savybes, todėl buvo nustatytas toks rašymo būdas, kad būtų galima spręsti apie negaliojimą:
Šis rašymas yra geras ir veikia gerai, tačiau gali sukelti labai rimtų našumo problemų.
Atkreipkite dėmesį, kad tai įmanoma, nebūtinai, ir jei aukščiau pateiktas metodas bus perduotas kaip masyvas<T>, sąrašas ar rinkinys<T>, problemų nekils.
Taigi, kada kas nors nutiks? Pažvelkime į šiuos metodus:
Kai skambinama:
Vykdymo greitis bus gana lėtas, o mano kompiuteris užtruko apie 70 sekundžių, kol parengė šaltinį. Skaičius() > 0。
Jei jį išanalizuosite, pamatysite, kad išeigos grąžinimas i GetNums kodo 5 eilutėje vykdomas int. MaxValue, ar tai būtina?
Tiesą sakant, kol grąžiname vieną elementą, galime daryti išvadą, kad aibė nėra tuščia ir nereikia grąžinti visų elementų.
Taigi, kaip spręsti? Galime naudoti Enumerable.Any plėtinio metodą:
Pakeiskite "SomeAction" metodą taip:
Paskambinkite dar kartą ir pamatysite, kad vykdymo laikas yra nereikšmingas.
Apibendrinant, Count() > 0 neišvengiamai turės našumo problemų, kai susidurs su yeild return.
|