Celý ten postup je založený na technologii zvané Language Integrated Query, tedy LINQ. Tečky jsou normální oddělovače jako všude, ale zalomil jsem řádky, protože je tady ten blok kódu úzký, tak aby to bylo přehlednější. Lze to samozřejmě zapsat i jako:
Dim prumer = "123456789".Where(Function(c) Char.IsNumber(c)).Select(Function(n) Integer.Parse(n)).Average()
A teď zpátky k LINQ. Funkce Select, Average, Where a podobně jsou definované na typu Enumerable (respektive rozhraní IEnumerable). Textový řetězec String také implementuje IEnumerable, protože je to vlastně množina znaků. LINQ funkce jsou funkce pro transformaci a filtrování takové množiny. "123456789".Where(Function(c) Char.IsNumber(c)) znamená: vezmi všechny prvky v množině 123456789 (množina Charů) a prožeň je (lambda) funkcí Function(c) Char.IsNumber(c). IsNumber vrací True pro 0-9 a False pro vše ostatní. Pokud funkce pro daný Char vrátí True, bude součástí výstupní množiny fce. Pokud tedy budu mít "a1b2c3d4---#9" a proženu to touto konstrukcí, dostanu množinu znaků [1,2,3,4,9]. Select(Function(n) Integer.Parse(n)) znamená projekci vstupního typu na výstupní pomocí opět lambda funkce Function(n) Integer.Parse(n). Integer.Parse udělá z typu Char typ Integer. My máme jistotu, že nemůže nastat problém, protože dostaneme na 100 % pouze znaky 0-9, které jsme si vyfiltrovali, pokud by ale tato jistota nebyla, používá se TryParse, což vrací Boolean a buď dosadí nebo nedosadí do předaného referenčního parametru. Výstupem této konstukce je množina Integerů [1,2,3,4,9]. Average() pak už je jen pomocná funkce, která umí vzít numerické datové typy (voláme jí na té možině integerů) a udělat z nich aritmetický průměr.
|