Před Linqem jsme obvykle používali následující metodu k určení, zda je kolekce neprázdná, tj. obsahuje prvky:
Použitím atributu Délka nebo Počet není s výše uvedeným psaním žádný problém.
Ale v éře Linq metoda rozšíření Enumerable.Count "sjednotila" vlastnosti Length and Count, což vedlo k následujícímu způsobu zápisu pro posouzení nenulity:
Tento text je v pořádku a funguje dobře, ale může způsobit velmi vážné problémy s výkonem.
Všimněte si, že je to možné, ne nutně, a pokud je výše uvedená metoda předána jako pole<T>, seznam nebo kolekce<T>, nebude problém.
Tak kdy se něco pokazí? Podívejme se na následující metody:
Když je povolán:
Rychlost spuštění bude poměrně pomalá a trvalo asi 70 sekund, než můj počítač spustil zdroj. Count() > 0。
Pokud ji analyzujete, zjistíte, že výnosový return i v řádku 5 kódu GetNums vykonává int. MaxValue, je to nutné?
Ve skutečnosti, pokud vrátíme jeden prvek, můžeme usoudit, že množina není prázdná a není nutné vracet všechny prvky.
Tak jak to posoudit? Můžeme použít metodu rozšíření Enumerable.Any:
Modifikujte metodu SomeAction následovně:
Zavolejte to znovu a zjistíte, že doba provedení je zanedbatelná.
Shrnuto, Count() > 0 bude mít nevyhnutelně problémy s výkonem, když narazí na návrat yeild.
|