Eine der großartigen Neuerungen im Sprachumfang von C# bzw. .NET 3.5 sind Lambda und LINQ.

Lambda erinnert mich einerseits an DEFINES von Ansi C, und andererseits an die sog. “Functors” von C++ und wurden hier vermutlich auch abgeguckt. Dennoch wurde Lambda integrativer gelöst, da ein Lambda-Ausdruck direkt innerhalb des Codes erfolgen kann, wo er benötigt wird. C++ – Functors wurden bzw werden i.d.R. als separate Klassenrümpfe mit einem überladenen operator() definiert.

Ein Lamda-Ausdruck sieht zum Beispiel so aus:

Func<int , int> sqr = x => x * x;
Console.WriteLine(sqr(10)); // Result: 100
</int>

LINQ (Abkürzung für Language INtegrated Query) ist eine Komponente von Microsofts .NET-Framework, mit der SQL-, XLink- und XQuery-Anfragen direkt in .NET-Programmiersprachen wie C# 3.0 oder VB.Net 9.0 als Code statt als String eingebunden werden können. LINQ wurde federführend von Turbo-Pascal- und C#-Autor Anders Hejlsberg entwickelt.

LINQ erweitert C# u.a. um direkte Selektion von Datenmengen innerhalb des Codes. Es wird keine Query in String-Form abgesetzt, sondern unmittelbar in dem Code integriert.

Am besten erklärt sich LINQ ein einem kleinen, konkreten Beispiel:

string[] names = { "Faust", "Peter", "Tom", "Fred", "August" };
var foundNamesAsQuery = from s in names
                        where s[0] == 'F'
                        select s;
foreach (string name in foundNamesAsQuery) Console.WriteLine(name);
// Result: Faust, Fred

Wenn LINQ schon in einer SQL-Syntax Datenmengen selektieren und filtern kann, unterstützt es dann auch Sortierungen à la “ORDER BY”? Mal gucken:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace linqtest
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] names = { "Faust", "Peter", "Tom", "Fred", "August" };
            var foundNamesAsQuery = from s in names
                                    where s[0] == 'F'
                                    orderby s descending
                                    select s;
            foreach (string name in foundNamesAsQuery) Console.WriteLine(name);
            Console.ReadLine();
 
        }
 
    }
}