none
Kann man diese Schleifen durch ein Linq - Kommando ersetzen. RRS feed

  • 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
    

    Mittwoch, 10. Juli 2013 14:27

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

    Mittwoch, 10. Juli 2013 16: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.

    Mittwoch, 10. Juli 2013 14:41
    Moderator
  • 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

    Mittwoch, 10. Juli 2013 15:04
  • 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.

    Mittwoch, 10. Juli 2013 15:51
    Moderator
  • 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

    Mittwoch, 10. Juli 2013 16:11