En intruduktion till Lambda i C# 3.0
Förord
Precis som i allting annat går det mode i programering. En programeringsnörd av kaliber bör naturligtvis hålla sig uppdaterad och kunna dessa nya trender (till skillnad från din chef som bara behöver kuna stava till det för att ta med det i sin power point presentation). Modeordet på agendan idag är Lambda.Innehåll
»»
»
Vad är lambda?
Lambda är väldigt kort förklarat en anonym funktion, eller inte bara kort förklarat – det är vad det faktiskt är. Detta låter fint, men vad betyder det egentligen?För att förklara närmare vad det är tänkte jag visa några rader kod. Ta följande funktion:
public int Addera(int a, int b) {
return a + b;
}
Här talar du om (deklarerar) för datorn att du har en funktion som du gärna vill kalla för ”Addera” och som helt sonika tar två tal och lägger ihop dem och returnerar resultatet till dig. Enda skillnaden mellan en varnlig funktion och en lambda-funktion är att lambda-funktionen är anonym, det vill säga den har inget namn. Motsvarande kod som lambda skulle vara ungefär så här:
(a, b) => a+b
Som du ser har den inget namn – den är anonym. Istället för att ge den ett namn kan vi lagra den i en variabel. Det gör du så här:
Func Addera = (a, b) => a + b;
Du har nu en variabel med vad som kan se ut som en ganska läskig typ. Om du tycker den läskiga typen är lite för läskig, bör du läsa på lite mer om generics. Utan att gå in närmare på generics så är Func en funktion, de första två intarna som följer är inparameterar och den sista är alltid returvärdet på funktionen. Du kan ha olika antal parametrar och till och med ingen alls. Om du vill ha en funktion som inte har något returvärde kallas det Action<> i .net biblioteket.
Du kan kalla på lambda-uttrycket i din variabel på följande sätt:
int summa = Addera(1, 2);
Vad är det bra för?
Hur använder man då dessa lambda-uttryck? Ett trevligt exempel är när du arbetar med listor. Låt oss säga att du har en lista med tal du vill skriva ut. Detta görs genom att använda sig av metoden ForEach() i List<>-klassen.//Ingen fara på taket så här långt.
List numbers = new List() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//Här kommer ett – kanske inte magiskt – men åtminstone spännande trick:
numbers.ForEach(n => Console.WriteLine(n));
Enkelt va? Det finns en mängd fina nya funktioner på List<>-objektet där du kan använda lambda-uttryck. Använd intellisense och din nyfikenhet för att finna dem. Många av dessa funktioner kan vi tacka linq för att de finns. Men det är som de säger i sagorna en helt annan historia.
Ytterligare ett trevligt användingsområde är vid alla event som vi så plågsamt får dras med när vi bygger sidor med ASP.NET. Låt oss säga att du ha en knapp (Button) där du vill skriva ut de smått berömda orden ”Hello world”. Vi utgår ifrån Page_Load-eventet.
public void Page_Load(object sender, EventArgs e) {
//En dynamiskt tillagd knapp.
Button uxButton = new Button();
uxButton.Text = "Click me!";
this.Form.Controls.Add(uxButton);
//”Looki looki – det betyder titta noga” – Joe Labero
uxButton.Click += (s,eventArgs) => Response.Write("Hello world");
}
Enkelt och vackert. All kod hamnar där den hör hemma istället för i en traditionell funktion som efter lite kodande hamnar 100 rader bort ifrån där den faktiskt används. Du slipper också att komma ihåg alla knepiga EvetnArgs-typer som events tenderar vilja ha.
Avslutande visdomsord
Jag hoppas att du kommer att få nytta av denna korta intruduktion och att det har varit i alla fall lite lärorikt. Dessutom hoppas jag, egoistisk som jag är, att det också kommer att bli lärorikt för mig.Detta är min första artikel och jag vill gärna ha mängder av kritik (helst konstruktiv), samt förslag på ytterligare ämnen som du skulle vilja läsa mer av eller som du tror att andra skulle vara intresserade av.
Mikael Söderström
Lambda expressions är sååå vackert! :-) Det hade varit kul med en jämförelse där du använder lambda expressions samt Linq för att hämta ut data ur en datakälla, t.ex. numbers.Where(n => n < 5) jämfört med "from n in numbers where n < 5 select n". Keep up the good work!
anders norell
Tack för en bra artikel! Går fn en kurs där detta nämndes utan ytterligare förklaring. Fick en bra bild av detta genom din förklaring.