2009-06-25 7 views
1

Ich bin ein erfahrener Entwickler in C# und arbeite an LOB-Anwendung aus den letzten 7 Jahren, habe ich einige Probleme beim Verständnis der Verwendung von Lambda-Expression in der Programmierung.Verwendung von Lambda-Expression in der praktischen Programmierung

Soweit ich verstehe, ist es im Fall von

  1. Arbeiten mit LINQ (Gruppierung, Select, Wo etc ..) nützlich ist
  2. Wir Lambda passieren Ausdruck auf jede Funktion als Argument, so Es kann anstelle von Delegaten oder anonymer Funktion oder normaler Funktion verwendet werden.
  3. Wir können generische Lambda-Funktion erstellen, die jede Datentypvariable als Argument akzeptiert und jeden Datentyp zurückgeben kann, z.

    MyFirstLambdaFunc((val1,val2) => val1+val2) 
    public R MyFirstLambdaFunc(Func lambdaexpression,T x,T y) 
    { 
        R Result = lambdaexpression(x, y); 
        return Result; 
    } 
    
  4. Codierung kann

Jetzt kompakt ist die Frage:

  1. Gibt es noch andere Vorteile?
  2. Wenn wir Lambda-Ausdruck als Funktion übergeben, können wir nur eine einzige Zeile Operation übergeben?
  3. Kann jemand eine Fallstudie oder ein praktisches Beispieldokument haben?

Vielen Dank im Voraus

Harish Bhattbhatt

Antwort

2

Für Nicht-Ausdruck Bäume, können Sie sicher Lambda mehrzeiligen Ausdrücke schreiben. Gerade heute morgen habe ich etwas entlang der Linien von:

var query = foo.Select(x => { 
       string text = x.Value; 
       int delimitedIndex = text.IndexOf(' '); 
       return int.Parse(text.Substring(0, delimitedIndex); 
      }); 

Lambda-Ausdrücke nützlich sein kann fast überall, dass Sie Delegat-Instanzen mit maßen einfache Implementierungen erstellen möchten.

Um einen anderen Fall in Frage zu stellen, stellen Sie sich vor, Sie möchten einige Threads starten, um mit jedem der vielen Werte zu arbeiten. (Lassen Sie uns die Tatsache ignorieren, dass wir viele Themen sind zu schaffen - die gleiche Technik auch für threadpools funktioniert.) Sie so etwas wie verwenden:

foreach (string url in urls) 
{ 
    // Slight quirk due to variable capture semantics 
    string urlCopy = url; 
    new Thread(() => FetchUrl(urlCopy)).Start(); 
} 

tun, dass in einer stark typisierten Weise normalerweise heikel ist - es gibt ParameterizedThreadStart , aber das ist nicht generisch, also wird es fummelig. Das ist ziemlich sauber IMO.

+1

Ich würde sagen, dass Lambda-Ausdrücke ein sehr gutes "Schließen" -Tool sind. Stimmst du nicht zu? Manchmal muss ich eine einfache Funktion schreiben, die "viel Staat" von t's Vorfahren wissen muss, also würde es eine Menge Parameter erfordern. Lambda-Ausdrücke helfen in diesen Situationen ... –

0

Dank Jon,

Ihre Multi-Line-Funktion sehr gut

empfangen wird

x => { string text = x.Value; int delimitedIndex = Text.IndexOf (''); Rückkehr int.Parse (text.Substring (0, delimitedIndex); }

wenn möglich können Sie einige weitere Beispiele oder eine Situation schaffen, in dem Lambda-Ausdruck von großer Hilfe anstelle von anderen Programmiertechniken sein kann ...nur wenn möglich

Ich denke, das wird so vielen Menschen helfen, weil das Wissen der Dinge technisch nicht ausreicht, aber wo es praktisch zu gebrauchen ist und wie es in bestimmten Situationen hilft, ist sehr wichtig.

+0

Die Dinge, die hier unten gepostet werden, sind Antworten. Um eine Folgefrage zu stellen, können Sie Kommentare (keine Antworten) hinterlassen oder Ihre Frage bearbeiten oder eine ganz neue Frage erstellen. Als Beispiele für Lambdas, versuchen Sie diese Website zu durchsuchen - es gibt Tausende von Beispielen. –

+0

Sicher ... als ich neu auf der Website war, war ich mir zu diesem Zeitpunkt nicht bewusst ... Entschuldigung von meiner Seite – Harryboy

0

Ich habe lambdas ziemlich viel als Event-Handler verwendet, z:

button.Click += (sender, e) => DoSomething(); 

Ich glaube, dass es eine sehr saubere Syntax erstellt und gelegentlich die Verschluss Semantik für den Umgang mit Ereignissen nützlich sein.

0

Die neue Task Parallel Library von .NET 4 verwendet sie ausgiebig. Zum Beispiel, wenn Sie einen Code-Block parallel ausführen möchten, können Sie schreiben:

Parallel.For(1, 10, i => 
{ 
    // do work 
}); 

Das funktioniert viel schöner als nur eine Methode, um es meiner Meinung nach, wie dies vorbei:

Parallel.For(1, 10, SomeMethodWithIntAsParam); 
Verwandte Themen