| 

.NET C# Java Javascript Exception

2
Ich habe eine Liste mit Büchern und und möchte darin alle Bücher finden, bei denen ein bestimmtes Suchwort im Titel vorkommt. Bisher mach' ich das über eine For-Each-Schleife. Geht das mit LINQ eventuell mit weniger Aufwand?
11.03.2011
teddy 21 1 2
1
retagged
alexander 11.03.2011
1 Antwort
6
In VB.Net mit der AbfrageSyntax wäre das z.B. wie folgt:

Dim qry = FOR buch IN buecher 
WHERE buch.Titel.IndexOf('Suchwort') > -1
SELECT buch


Du kannst dann die qry mit ForEach durchlaufen. Dann hast Du allerdings immer noch Deine Schleife :) Es kommt darauf an, was Du in der Schleife machen würdest, bzw. wozu Du die benutzt.

Hier noch ein Beispiel mit der Methodensyntax, die dasselbe macht:

Dim qry = buecher.Where(Function(buch) buch.Titel.IndexOf('Suchwort') > -1)


In C# finde ich es deutlich lesbarer:
var qry = buecher.Where( buch => buch.Titel.IndexOf('Suchwort') > -1)


Für meinen Geschmack verwirrt einen VBler ein "Function" irgendwo mittendrin mehr, als ein =>. Ist mir rätselhaft, weshalb Microsoft auch die Syntaxen bei komplett neuen Funktionen so getrennt hält, ohne das Übersichtlichkeit gewonnen wird.

Du kannst auch eine eigene ForEach-Erweiterungsmethode definieren und so theoretisch dann innerhalb der "Schleife" weiteren Quellcode ausführen.

Public Module Extensions

<System.Runtime.CompilerServices.Extension> _
Public Shared Sub ForEach(Of T)(source As IEnumerable(Of T), func As Action(Of T))
For Each item As var In source
func(item)
Next
End Sub
End Module


Innerhalb der Abfrage nun die Titel auf der Console auzugeben, würde dann so gehen:

Dim qry = buecher.Where(Function(buch) buch.Titel.IndexOf('Suchwort') > -1) _
.ForEach(Function(buch) Console.WriteLine(buch.Titel))


Letztendlich ist die Schleife immer noch da, nur ausgelagert in die Erweiterungsmethode.

Du siehst, es ist nicht weniger Aufwand mit LINQ. Es kann aber u.U. schöner oder auch leichter lesbar sein. Sicher nicht bei solch verhältnismässig einfachen Aufgabenstellungen. Interessant bei LINQ ist der Aspekt, das die Abfrage (qry) erst wirklich ausgeführt wird, wenn sie benutzt wird. Nur die Deklaration oben im ersten Beispiel macht noch rein gar nichts. Das kann u.U. auch sehr praktisch sein.

Für einen allgemeinen Einstieg mit VB und LINQ kann ich Dir entweder dieses Galileo OpenBook empfehlen.

PS: Oder wenn es auch C# sein darf, meine *hust* Bachelorarbeit. Findest Du leicht über Google. Die Erweiterungsmethode musste ich mir eben auch daraus kopieren :)
Darin ist auch die "herkömmliche" Vorgehensweise mit LINQ verglichen und ein paar Vor- und Nachteile werden überprüft. Ich hoffe, hier hagelt es jetzt nicht fiese Kritiken.....
11.03.2011
Jens Duczmal 2,6k 1 3 9
Jens Duczmal 2,6k 1 3 9
1
Danke für den Hinweis auf die Bachelorarbeit. Ein schönes Nachschlagewerk. +1
Jürgen Luhr 11.03.2011
Komisch, haben mir schon 2 "Fremde" gesagt nur der Prof. war alles andere als begeistert. Dankeschön. Muntert auf :)
Jens Duczmal 11.03.2011

Stelle deine .net-Frage jetzt!