Kadar predvidevamo, da bomo neko funkcijo uporabili samo enkrat, jo definiramo kar "in-line". Drugi funkciji lahko damo kot parameter funkcijo samo. Izrazno močen in eleganten način pisanja anonimih funkcij je s pomočjo lambda izrazov.
Primer:
Izpis kvadratov celih števil od 1 do 10
1 var squares = Enumerable.Range(0, 10).Select(x => x * x);
2
3 foreach (int num in squares)
4 {
5 Console.WriteLine(num);
6 }
7
Iz naslednjega primera bo še bolj razvidna moč fluent interface-a.
Primer:
Na množici celih števil od 1 do 10, izberimo podmnožico lihih števil razvrščene od največjega do namanjšega. Vsak element podmnožice korenimo s kvadratnim korenom. Ustvarimo močno tipizirano generično kolekcijo z novim anonimnim tipom, ki naj ima dva propertija, osnovo in kvadratni koren osnove.
Omenjeno transformacijo je možno naredit v eni vrstici, zaradi preglednosti je koda zapisana v "več" vrsticah.
var collection = Enumerable.Range(0, 10)
.Where(x => x % 2 != 0)
.Reverse()
.Select(x =>
new { Original = x,
SquareRoot = Math.Sqrt(x)
});
V parameter listi metode Select() smo na desni strani lambda izraza uporabili object initializer in s keywordom "new" ustvarili nov anonimni tip. Compiler v compile time-u v odzadju ustvari nov anonimni razred, njegovo definicijo pa izpelje(type inference) iz object initializerja.
Vsaka od generičnih metod na IEnumerable
Primer iz PBRT4Lividature, kjer je bilo potrebno zgenerirat argumente za eksterni program za risanje grafov:
Na objektu List
1 var documentFlow = (List<Posta_referent>)p.ForwardedTo;
2
3 documentFlow.ForEach(refer =>
4 {
5 edge = edge + refer.Referent_posredoval + " -> " + refer.Referent + ";";
6 });
Torej kadar delamo operacije nad elementi v kolekcijah, pride prav obsoječi interface "extension" method, ki jih je microsoft dodal v tipe generičnih kolekcij. Anonimne metode ni potrebno več izražati z delegati, saj so na voljo lambda izrazi, s katerimi je možno definirati anonimne metode še bolj kompaktno.
0 comments:
Post a Comment