let - explained

Wraz z LINQ do C# zawitało słówko kluczowe let. Najpierw krótkie naszego dzisiejszego gościa przedstawienie. Wyobraźmy sobie klasę Person z imieniem, nazwiskiem oraz wiekiem. Idąc dalej wyobraźmy sobie zadanie: wybrać te osoby, których wiek jest mniejszy niż średnia wieku wszystkich osób w zbiorze. Konstrukcja let daje nam możliwość zapamiętania danej wartości w samym sercu zapytania LINQ, co pozwala nam zwiększyć jego czytelność i uniknąć deklarowania zmiennych poza jego wnętrzem. Przykład:

 1:   var young = from person in persons
2: let average = persons.Average(p => p.Age)
3: where person.Age < average
4: select person;

Oczywiście jest to najbanalniejszy z banalnych przykładów, jednak niechajże postara się szanowny Czytelnik pomysleć o tworzeniu w ten sposób skomplikowanych warunków, dodawaniu "podzapytań" itd, a przed oczami Jego jawić się będzie moc nieprzemierzona o dowolnym stopniu zaawansowania.

Może się jednak zdarzyć, że podobna funkcjonalność będzie nam przydatna także poza kontekstem standardowych C#'owych zapytań LINQ - czyli przy korzystaniu ze standardowych metod. Co wtedy? Trzeba sobie takie zachowanie zasymulować - poprzez wykorzystanie kolejnej nowości z C# 3.0 czyli typów anonimowych. Powyższy przykład da się zapisać w sposób następujący:

 1:   var young = persons.Select(p => new { Person = p, Average = persons.Average(p2 => p2.Age) })
2: .Where(p => p.Person.Age < p.Average);

Tak na marginesie - kompilator C# robi dokładnie to samo. Skąd u mnie taka mądrość? Stąd co zwykle - z Reflectora.


UPDATE 13-07-2008:
Pojawił się nowy post traktujący o niebezpieczeństwie związanym z omawianą kontrukcją.

Opublikowane 07 lipca 08 07:18 przez Procent
Filed under: ,

Komentarze:

# Gutek said on lipca 7, 2008 20:47:

JAk zwykle % :) ql :)

Polecam rowniez artykul:

http://tomasp.net/articles/dynamic-flinq.aspx

oraz specifikacje F# (jako ze slowo kluczowe let jest tam notorycznie wykozystywane;)):

http://research.microsoft.com/fsharp/manual/lexyacc.aspx

Gutek

# apl said on lipca 7, 2008 21:13:

To ja jeszcze dorzucę link do takiego posta:

http://blogs.msdn.com/lukeh/archive/2007/10/01/taking-linq-to-objects-to-extremes-a-fully-linqified-raytracer.aspx

w którym Luke Hoban (Program Manager w zespole pracującym nad rozwojem kompilatora C#) prezentuje, jak w jednym wielkim, liczącym 60 linii kodu zapytaniu LINQ zaimplementować... RayTracer. 80% tej produkcji stanowi właśnie sprytne wykorzystanie słowa kluczowego let.

# Zine.NET said on lipca 13, 2008 20:21:

W poprzednim poście zapoznaliśmy się ze słówkiem &quot;let&quot; . Dzisiaj do niego powrócimy i zobaczymy

Komentarze anonimowe wyłączone

About Procent