Aufbruch zu neuen Ufern: C# 3.0

Notwendige Spracherweiterungen

Query-Anweisungen der oben gezeigten Art werden ausschließlich durch einige zusätzliche Sprachkonstrukte sowie durch eine Erweiterung des .NET-Frameworks um neue Namensräume (in unserem Beispiel „System.Query“) möglich. Die Common Language Runtime (CLR), die Microsoft zur Unterstützung von Generics für Visual Studio 2005 erheblich aufgebohrt hat, kann für LINQ unverändert bleiben. Deshalb läuft die auf der PDC 2005 veröffentlichte LINQ Preview auch problemlos mit der CLR 2.0 zusammen.

Im Prinzip könnten Query-Statements ganz ohne Erweiterungen von C# geschrieben werden. Die Konstrukte wären dann allerdings ziemlich unhandlich. Unser obiges Beispiel sähe mit dem im November 2005 erscheinenden C# 2.0 etwa so aus:

class TestOld
{
static void Main()
{
string[] cities = { "Amsterdam", "Brüssel", "Bonn", "Berlin", "Helsinki", "Oslo", "Moskau", "Kiew", "Warschau", "Prag", "Budapest", "Wien" };

Func<string, bool> filter = delegate(string s)
{
return s.Length < 5;
};

Func<string, string> extract = delegate(string s)
{
return s;
};

Func<string, string> project = delegate(string s)
{
return s.ToUpper();
};

IEnumerable<string> shortCities = cities.Where(filter) .OrderBy(extract) .Select(project);
foreach (string city in shortCities)
Console.WriteLine(city);
}
}

Vorausgesetzt, die Methoden Where, Select und OrderBy wären auf allen Collections sinnvoll definiert, so würde der obige Code unter C# 2.0 fehlerfrei übersetzen. Er ist funktional gleichbedeutend zu unserem ersten Codebeispiel, aber erheblich länger, komplizierter zu verstehen und weniger elegant.