Benutzer mit den meisten Antworten
Kann man diese Schleifen durch ein Linq - Kommando ersetzen.

Frage
-
Hallo,
ich möchte Linq lernen
kann man folgende Schleifenkonstruktion durch ein Linq-Kommando ersetzen?
Sub AddListe(col As ObservableCollection(Of Basisklasse), query As System.Collections.Generic.IEnumerable(Of Basisklasse)) Dim obj As Basisklasse For Each obj In query col.Add(obj) Next End Sub Private Function getChildren(ds As XElement) As ObservableCollection(Of Basisklasse) Dim query1 = (From lds In ds.<Gruppe> Select New Gruppe With {.Bezeichnung = lds.@Bezeichnung, .Children = getChildren(lds)}) Dim query2 = (From pds In ds.<Person> Select New Person With {.Vorname = pds.<Vorname>.Value, .Nachname = pds.<Nachname>.Value}) Dim col1 As ObservableCollection(Of Basisklasse) = New ObservableCollection(Of Basisklasse) AddListe(col1, query1) AddListe(col1, query2) Return col1 End Function Sub Main() Dim xmlDaten As XElement = XElement.Load(Dateiname) Dim query = getChildren(xmlDaten) Stop End Sub
Antworten
-
Danke, jetzt funzt es.
getChilden sieht nun so aus
Private Function getChildren(ds As XElement) As ObservableCollection(Of Basisklasse) Dim query1 = New List(Of Basisklasse)(From lds In ds.<Gruppe> Select New Gruppe With {.Bezeichnung = lds.@Bezeichnung, .Children = getChildren(lds)}).ToList Dim query2 = New List(Of Basisklasse)(From pds In ds.<Person> Select New Person With {.Vorname = pds.<Vorname>.Value, .Nachname = pds.<Nachname>.Value}).ToList query1.AddRange(query2) Return New ObservableCollection(Of Basisklasse)(query1) End Function
AddListe gibt's nicht mehr.
Grüße
Jürgen
- Als Antwort markiert Ionut DumaModerator Dienstag, 16. Juli 2013 15:11
Alle Antworten
-
Hallo,
die getChildren-Methode verwendet bereits LINQ (From...In...Select). Ich nehme mal an, das du die AddListe-Methode meinst. Eine ObservableCollection(Of T) hat leider keine AddRange-Methode wie viele andere Listen. Man kann zwar eine Erweiterungsmethode erstellen, aber letzten Endes muss man immer eine Schleife nutzen. Ein LINQ-Ausdruck ist also nicht möglich.
Wenn deine beiden LINQ-Ausdrücke funktionieren, dann kann man keine Schleife wirklich verbessern. LINQ würde sich nur eignen, wenn du die Liste komplett ersetzen möchtest.
Wenn du LINQ lernen möchtest, dann ist Codeproject meistens ein guter anlaufpunkt:
http://www.codeproject.com/KB/linq/Weiterhin auch die MSDN:
http://msdn.microsoft.com/de-de/library/vstudio/bb397926.aspx<Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite | Code Beispiele | Facebook | Twitter | Snippets
Wenn die Frage beantwortet ist, dann markiert die hilfreichsten Beiträge als Antwort und bewertet die Beiträge. Danke.
Einen Konverter zwischen C# und VB.NET Code gibt es hier. -
Hallo,,
ja, ich meine die AddListe Zeilen.
query1 ist System.Collections.Generic.IEnumerable(Of Gruppe)
query2 ist System.Collections.Generic.IEnumerable(Of Person)
Gruppe und Person sind abgeleitet von Basisklasse und ich möchte query1 und query2 zu einer union all verbinden von type ObservableCollection(Of Basisklasse)
also ist meine AddListe schon die beste Lösung?
Grüße
Jürgen
-
In diesem Speziellen Fall könnte man vielleicht noch etwas effektiveren. Du erstellst aus beiden Ergebnissen der LINQ-Ausdrücke eine Liste und fügst die 2. zur 1. hinzu:
var v1 = (from x in new string[]{"1", "2", "3"}select x).ToList();//Liste 1 var v2 = (from x in new string[]{"a", "b", "c"}select x).ToList();//Liste 2 v1.AddRange(v2);//2. Liste zur 1. hinzufügen
Dann kannst du eine OC aus der Liste erstellen:
ObservableCollection<string> col1 = new ObservableCollection<string>(v1);//OC aus v1 erstellen
Aber die AddRange-Methode gibt's nicht bei allen Listen. Die Konstrukor-Überladung zu verwenden ist soweit ich weiß die einzige Möglichkeit.
Ist die OC jedoch schon gegeben, dann ist die AddList-Methode die einzige Variante.
<Code-13/>- Koopakiller [kuːpakɪllɐ] (Tom Lambert)
Webseite | Code Beispiele | Facebook | Twitter | Snippets C# ↔ VB.NET Konverter
Markiert bitte beantwortende Posts als Antwort und bewertet Beiträge. Danke. -
Danke, jetzt funzt es.
getChilden sieht nun so aus
Private Function getChildren(ds As XElement) As ObservableCollection(Of Basisklasse) Dim query1 = New List(Of Basisklasse)(From lds In ds.<Gruppe> Select New Gruppe With {.Bezeichnung = lds.@Bezeichnung, .Children = getChildren(lds)}).ToList Dim query2 = New List(Of Basisklasse)(From pds In ds.<Person> Select New Person With {.Vorname = pds.<Vorname>.Value, .Nachname = pds.<Nachname>.Value}).ToList query1.AddRange(query2) Return New ObservableCollection(Of Basisklasse)(query1) End Function
AddListe gibt's nicht mehr.
Grüße
Jürgen
- Als Antwort markiert Ionut DumaModerator Dienstag, 16. Juli 2013 15:11