Gewusst wie: Verwenden von Lambda-Ausdrücken in einer Abfrage (C#-Programmierhandbuch)

Aktualisiert: November 2007

Sie verwenden zwar keine Lambda-Ausdrücke direkt in der Abfragesyntax, aber in Methodenaufrufen. Außerdem können Abfrageausdrücke Methodenaufrufe enthalten. Einige Abfrageoperationen können sogar nur unter Verwendung von Methodensyntax ausgedrückt werden. Weitere Informationen über den Unterschied zwischen Abfragesyntax und Methodensyntax finden Sie unter Abfragesyntax und Methodensyntax (LINQ).

Im folgenden Beispiel wird der Umgang mit einem Lambda-Ausdruck in einer methodenbasierten Abfrage veranschaulicht, indem der Enumerable.Where-Standardabfrageoperator verwendet wird. Beachten Sie, dass die Where-Methode in diesem Beispiel einen Eingabeparameter des Delegattyps Func<TResult> hat. Dieser Typ ist ein Delegat, der eine ganze Zahl als Eingabe erfordert und einen booleschen Wert zurückgibt. Der Lambda-Ausdruck kann in diesen Delegattyp konvertiert werden. Wäre dies eine LINQ to SQL-Abfrage, die die Queryable.Where-Methode verwendet, wäre der Parameter vom Typ Expression<Func<int,bool>>, aber der Lambda-Ausdruck würde genau gleich aussehen. Weitere Informationen über den Ausdruckstyp finden Sie unter System.Linq.Expressions.Expression.

class SimpleLambda
{
    static void Main()
    {

        // Data source.
        int[] scores = { 90, 71, 82, 93, 75, 82 };

        // The call to Count forces iteration of the source
        int highScoreCount = scores.Where(n => n > 80).Count();

        Console.WriteLine("{0} scores are greater than 80", highScoreCount);

        // Outputs: 4 scores are greater than 80            
    }
}


Im folgenden Beispiel wird die Verwendung eines Lambda-Ausdrucks in dem Methodenaufruf eines Abfrageausdrucks veranschaulicht. Der Lambda-Ausdruck ist erforderlich, da der Sum()-Standardabfrageoperator nicht mithilfe von Abfragesyntax aufgerufen werden kann.

Mit der Abfrage werden die Studierenden zunächst nach ihrer Jahrgangsstufe gruppiert, wie in der GradeLevel-Enumeration definiert. Dann werden für jede Gruppe die Ergebnisse pro Student addiert. Dies erfordert zwei Sum-Operationen. Mit der inneren Sum wird das Gesamtergebnis für jeden Studenten berechnet, und mit der äußeren Sum wird eine kombinierte laufende Summe für alle Studenten in der Gruppe berechnet.

private static void TotalsByGradeLevel()
{
    // This query retrieves the total scores for First Year students, Second Years, and so on.
    // The outer Sum method uses a lambda in order to specify which numbers to add together.
    var categories =
    from student in students
    group student by student.Year into studentGroup
    select new { GradeLevel = studentGroup.Key, TotalScore = studentGroup.Sum(s => s.ExamScores.Sum()) };

    // Execute the query.   
    foreach (var cat in categories)
    {
        Console.WriteLine("Key = {0} Sum = {1}", cat.GradeLevel, cat.TotalScore);
    }
}
/*
     Outputs: 
     Key = SecondYear Sum = 1014
     Key = ThirdYear Sum = 964
     Key = FirstYear Sum = 1058
     Key = FourthYear Sum = 974
*/


Um diesen Code auszuführen, kopieren Sie die Methode und fügen sie in die StudentClass-Klasse ein, die in Gewusst wie: Abfragen einer Auflistung von Objekten (C#-Programmierhandbuch) bereitgestellt wird, und rufen sie über die Main-Methode auf.

Community-Beiträge

Anzeigen: