Jedes Mal, wenn ich eine Frage im Stapelüberlauf in C # sehe, werden mindestens ein oder zwei Antworten angezeigt, die ein Problem mit LINQ lösen. Normalerweise scheinen Leute mit sehr hohem Ansehen LINQ-ähnliche Profis zu verwenden.
Meine Frage ist also, für welche Problemdomäne soll LINQ verwendet werden?
Auch zu den Randnotizen: Gibt es irgendwelche Zwecke, bei denen es vermieden werden sollte? Beeinflusst die Größe des Datasets die Leistung von LINQ-Abfragen?
c#
linq
professional-development
user1816120
quelle
quelle
Antworten:
LINQ wurde in erster Linie entwickelt, um reine funktionale Abfragen und Transformationen von Datensequenzen zu ermöglichen (Sie werden feststellen, dass alle LINQ-Erweiterungen Func-Delegates, aber keine Action-Delegates aufnehmen). Folglich ist der häufigste Fall einer Schleife, die nicht sehr gut zu LINQ passt, eine, bei der es um nicht reine funktionale Nebenwirkungen geht, z
Um LINQ besser nutzen zu können, üben Sie es einfach.
Überlegen Sie sich, wann immer Sie eine
for
oder eineforeach
Schleife schreiben möchten, um etwas mit einer Sammlung zu tun, ob sie zu LINQ passt (dh nicht nur eine Aktion oder einen Nebeneffekt auf die Elemente ausübt), und zwingen Sie sich dann zum Schreiben es mit LINQ.Sie können die
foreach
Version auch zuerst schreiben und dann in eine LINQ-Version umschreiben.Wie Svick betont, sollte es in LINQ darum gehen, Ihr Programm besser lesbar zu machen. Dies ist normalerweise gut, da es eher die Absicht des Codes als den Mechanismus betont. Wenn Sie jedoch feststellen, dass Ihre Abfragen nicht lesbarer sind als eine einfache Schleife, können Sie sich gerne an die Schleife halten.
Wenn Sie Übungen zum Üben benötigen, lassen sich die meisten funktionalen Programmierübungen gut auf LINQ abbilden, z. B. 99 Probleme (insbesondere die ersten 20 oder so) oder Project Euler .
quelle
Aggregate()
. Ich denke die meiste Zeit ist die Schleife besser lesbar.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:Betrachten Sie das LINQ-Äquivalent:
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:
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.
quelle
Im Laufe der Zeit wurden verschiedene Sprachen für die verschiedenen Arten von Datenquellen entwickelt, beispielsweise SQL für relationale Datenbanken und XQuery für XML. Daher mussten Entwickler für jeden Datenquellentyp oder jedes Datenformat, das sie unterstützen müssen, eine neue Abfragesprache lernen. LINQ vereinfacht diese Situation, indem es ein konsistentes Modell für die Arbeit mit Daten über verschiedene Arten von Datenquellen und -formaten hinweg anbietet. In einer LINQ-Abfrage arbeiten Sie immer mit Objekten. Weitere Informationen finden Sie unter http://msdn.microsoft.com/en-us/library/bb397906.aspx
quelle