Um die bearbeitete Frage zu beantworten: Kurz gesagt, es ist nützlich, LINQ immer dann zu verwenden, wenn Sie die "Abfrage" -Funktionalität implementieren müssen (wofür das Q in LINQ steht). Das Definieren einer genauen Domäne ist schwierig, vereinfacht jedoch eine Vielzahl von Aufgaben im Zusammenhang mit dem Extrahieren und Bearbeiten von Daten aus Sammlungen erheblich.
Um es kurz zu machen: Viele Abfragefunktionen wurden direkt in die Sprache (oder vielmehr in die verschiedenen LINQ-Implementierer) integriert, sodass Dinge wie Aggregationen, Ordnen, Gruppieren, Filtern, Projektionen, Verknüpfungen (und vieles mehr) behandelt werden Sie. Die LINQ-basierten Lösungen sind in der Regel auch viel kürzer als wenn Sie sie "von Hand" implementieren und ihre Absichten weitaus besser kommunizieren würden.
Ein einfaches Beispiel, das oft hilft, die Leistungsfähigkeit von LINQ zu vermitteln, ist die Anzeige des Inhalts eines Verzeichnisses, gruppiert nach Erweiterung. Führen Sie eine typische Imperativimplementierung in Ihrem Kopf durch - es werden bereits zu Beginn viele Implementierungsdetails angezeigt. Vielleicht werden wir a verwenden, Dictionary<String, List<String>>
um die Dateien nach Erweiterung zu indizieren. Natürlich müssen wir prüfen, ob ein Schlüssel bereits vorhanden ist, eine Liste instanziieren, hinzufügen usw. Es könnte ungefähr so aussehen:
Dictionary<string, List<string>> fileGroups = new Dictionary<string, List<string>>();
foreach (string file in Directory.GetFiles(Environment.CurrentDirectory))
{
string extension = Path.GetExtension(file).ToLower();
if (!fileGroups.ContainsKey(extension))
{
fileGroups[extension] = new List<string>();
}
fileGroups[extension].Add(file);
}
Betrachten Sie das LINQ-Äquivalent:
var query = from file in Directory.GetFiles(Environment.CurrentDirectory)
group file by Path.GetExtension(file).ToLower();
Beachten Sie, dass die Abfrage selbst nur aus 2 Zeilen besteht, was sicherlich kürzer ist als jede zwingende Lösung, die wir uns hätten ausdenken können. Es ist auch ziemlich lesbar; Das Signal-Rausch-Verhältnis ist höher als bei der ersten Lösung. Für diejenigen, die neu in LINQ sind, würden Sie die Ergebnisse dieser Abfrage wie folgt ausgeben:
foreach (var fileGroup in query)
{
Console.WriteLine(String.Format("*** Files with extension: {0}", group.Key));
foreach (string file in fileGroup)
{
Console.WriteLine(file);
}
}
Bei komplexeren Beispielen werden die Unterschiede normalerweise noch größer (z. B. einfach nach mehreren Feldern gruppieren). Zusammenfassend lässt sich sagen, dass LINQ viele "alltägliche" Datenabfrageprobleme auf eine Art und Weise löst, die oft kürzer und selbsterklärender ist. Dies ist mit geringen Kosten für das Erlernen der Syntax und der Technologie verbunden, aber die Vorteile überwiegen bei weitem die Nachteile.