Dzisiaj opisze mechanizm lamba expression.
Dla przypomnienia Linq jest połączeniem 5 elementów:
- extension methods
- yield
- Func, Predicate, Action
- wyrażenia lambda
- IQueryable i Expression Trees
Wyrażenia lambda to nic innego jak syntactic sugar czyli taki bonus od Microsoftu, który ułatwia pisanie kodu. Wyrażenia lambda upraszczają zapisu delegatu. Przypomnijmy przykład z poprzedniego wpisu.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Program { static void Main(string[] args) { var list = new List<int> {2, 4, 6, 8, 5, 10}; Func<int,bool> isModTwo = delegate(int i) { return i%2 == 0; }; foreach (var x in list.TakeWhile(isModTwo)) { Console.WriteLine(x); } } } |
Przykład ten wypisuje liczby z kolekcji dopóki są to liczby parzyste. Jednak cała składnia jest trochę trudna do przeanalizowania ponieważ, najpierw deklarujemy zmienna typu Func o nazwie isModTwo i przypisujemy do niej delegata anonimowego a następnie przekazujemy zmienna do TakeWhile. W takim przypadku osoba analizująca kod musimy więc pamiętać co kryje definicja zmiennej isModTwo.
Oczywiście, nie musimy w ogóle korzystać ze zmiennej, możemy bezpośrednio w wywołaniu funkcji TakeWhile wpisać delegata anonimowego.
1 2 3 4 5 6 7 8 9 10 11 12 |
class Program { static void Main(string[] args) { var list = new List<int> {2, 4, 6, 8, 5, 10}; foreach (var x in list.TakeWhile(delegate(int i) { return i%2 == 0; })) { Console.WriteLine(x); } } } |
Jak widzimy kod stał się łatwiejszy w zrozumieniu ponieważ wszystkie instrukcje mają swoją logiczną kolejność i nie trzeba skakać po kodzie w poszukiwaniu deklaracji delegata. Teraz ten sam kod zapisany za pomocą wyrażenia lambda.
1 2 3 4 5 6 7 8 9 10 11 12 |
class Program { static void Main(string[] args) { var list = new List<int> {2, 4, 6, 8, 5, 10}; foreach (var x in list.TakeWhile((i) => i % 2 == 0)) { Console.WriteLine(x); } } } |
Jak widać ten sam delegat zapisany za pomocą wyrażenia lambda jest bardziej zwięzły. Dzięki zastosowaniu wyrażeń lambda nie musimy pisać już słowa kluczowego delegate. Można opuścić również słowo return o ile wyrażeniem jest jedna instrukcja. Nawiasy przy zmiennej i są również opcjonalne w tym przypadku. Jeśli wyrażenie lambda przyjmuje 0 lub więcej niż jeden parametr nawiasy są wymagane.
Podsumowując składnia wyrażenia lambda, na pierwszy rzut oka może wyglądać dziwnie i wielu początkujących programistów to odstrasza. Jednak gdy już zrozumie się że to nic innego jak uproszczony zapis delegata już nigdy nie przestanie się ich używać ponieważ znacząco ułatwiają życie programisty.
Najnowsze komentarze