2008-08-24 15 views
20

Czytałem, że wyrażenia Lambda są niewiarygodnie potężnym dodatkiem do C#, ale jestem przez nich zakłopotany. Jak mogą poprawić moje życie lub ulepszyć mój kod? Czy ktokolwiek może wskazać dobry zasób do nauki takich wyrażeń?Jakie jest dobre wykorzystanie wyrażeń lambda i jak mogę się ich nauczyć?

Wydają chłodny jak diabli, ale w jaki sposób odnoszą się one do życia z dnia na dzień jako programista asp.net?

Edytuj: Dziękujemy za przykłady i podziękowania za link do artykułów Eric White. Wciąż je trawię. Jedno szybkie pytanie: czy wyrażenia lambda są użyteczne dla niczego innego niż zapytanie? Każdy przykład, który widziałem, był konstruktem zapytania.

+0

To są dobre odpowiedzi, ale wcześniej też je zadawano. Drugie [pytanie] (http://stackoverflow.com/questions/16501/what-is-a-lambda-function) jest dobrym zasobem. –

Odpowiedz

9

: wyrażenia lambda są przydatne do niczego innego niż odpytywanie

wyrażeń Lamba są niczym wiele innych niż wygodny sposób pisania funkcji „in-line”.

więc są użyteczne w każdym miejscu chcesz kawałek kodu, który można nazwać, jakby to oddzielna funkcja, ale która jest faktycznie napisane wewnątrz swojego rozmówcy. (Oprócz zachowania powiązanego kodu w tej samej lokalizacji w pliku, pozwala to również na granie zabawnych gier ze zmiennym określeniem zakresu - patrz "zamknięcia" w celach referencyjnych.)

Przykład użycia niezwiązanego z zapytaniem lamba może być trochę kodu, który robi coś asynchronicznie, że zaczynasz od ThreadPool.QueueUserWorkItem. Istotne jest to, że możesz również napisać to używając anonimowych delegatów (które były wprowadzeniem C# 2), lub po prostu zwykłej, oddzielnej funkcji klasy.

Ten http://blogs.msdn.com/jomo_fisher/archive/2005/09/13/464884.aspx to doskonałe wprowadzenie krok po kroku do tego wszystkiego, co może pomóc.

6

Lambdas wprowadzają funkcjonalne programowanie do C#. Są to funkcje anonimowe, które można przekazywać jako wartości do niektórych innych funkcji. Używany najczęściej w LINQ.

Oto zmyślony przykład:

List<int> myInts = GetAll(); 
IEnumerable<int> evenNumbers = myInts.Where(x => x % 2 == 0); 

Teraz gdy foreach poprzez evenNumbers z Lamda

x=> x % 2 == 0 

jest następnie stosowana jako filtr do myInts.

Stają się one bardzo przydatne w zwiększeniu czytelności skomplikowanych algorytmów, które miałyby wiele zagnieżdżonych IF warunkowe i pętle.

4

Oto prosty przykład coś fajnego można zrobić z lambdas:

List<int> myList = new List<int>{ 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
myList.RemoveAll(x => x > 5); 
//myList now == {1,2,3,4,5} 

Sposób removeAll wykonuje orzeczenie (delegata, który zaczyna argurments i zwraca bool) każda, które go dopasować zostaną usunięte. Użycie wyrażenia lambda sprawia, że ​​jest on prostszy niż deklarowanie predykatu.