none
2 Listen -> 1 unique Liste RRS feed

  • Frage


  • Hallo,
    ich habve 2 Listen
    Liste A
      1
      2
      3
      4
      5
     
    Liste B
      2
      3
      6
      7
      8
    Ziel  Neue Liste ohne doppelte Nummern
      1
      2
      3
      4
      5
      6
      7
      8
    Wie führe ich die Listen in eine neue Liste am besten zusammen?
    Grüße Martin
    Donnerstag, 17. November 2016 18:59

Antworten

Alle Antworten

  • Hallo Martin,

    dafür gibt es verschiedene Möglichkeiten. Als erstes die intuitive Variante:

    List<int> list1 = new List<int> { 1, 2, 3, 4, 5 };
    List<int> list2 = new List<int> { 2, 3, 6, 7, 8 };
    List<int> list3 = new List<int>(list1);
    foreach(int i in list2)
    {
      if(!list3.Contains(i))
      {
        list3.Add(i);
      }
    }
    list3.Sort();

    Einfacher zu schreiben ist aber Folgendes:

    List<int> list4 = new List<int>(list1);
    list4.AddRange(list2);
    IEnumerable<int> list5 = list4.Distinct();

    Beste Grüße


    • Bearbeitet Flogex Donnerstag, 17. November 2016 19:26
    • Als Antwort vorgeschlagen Florian Haupt Freitag, 18. November 2016 09:48
    Donnerstag, 17. November 2016 19:22
  • Hallo zusammen,

    ich würde hier auf 2 oder 3 LinQ Methoden setzen:

    var result = list1.Concat(list2).Distinct().ToList();

    Concat hängt dabei 2 Listen aneinander. Distinct gibt anschließend nur die Elemente zurück, die nicht bereits in der Liste sind. Von Distinct gibt es auch eine Überladung der du ggf. einen eigenen Comparer übergeben kannst, falls du nicht auf den Mechanismus von GetHashCode und Equals setzen willst.

    Falls du nur eine Auflistung als IEnumerable brauchst hast du es damit geschafft. Die ToList Methode erzeugt ggf. noch eine List<T> für dich.

    PS: Um die LinQ Erweiterungsmethoden benutzen zu können, musst du den System.Linq Namespace importieren (using-Statement).


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets


    Donnerstag, 17. November 2016 23:55
    Moderator
  • Hallo zusammen,

    dafür gibt es die Union Methode (Vereinigung, wie auch in SQL). Zum Bleistift:

                var list1 = new List<int> { 5, 4, 1, 2, 3 };
                var list2 = new List<int> { 2, 3, 6, 7, 8 };
                var unionResult = list1.Union(list2);
                    // .OrderBy((value) => value); // Optional sortieren
                foreach(int value in unionResult)
                    Console.WriteLine(value);

    Für weitere Varianten siehe Intersect (Vereinigung) und Except (Ausschluss/Differenz) wie in der Mengenlehre definiert.

    Gruß Elmar

    Freitag, 18. November 2016 10:36
    Beantworter
  • Hallo Zusammen,
    ja stimmt, geht relativ einfach.
    Mein Problem ist nun, ich habe 2 Listen mit Objekten, nicht nur int.
    List<Product> listSide1; 
    List<Product> listSide2;
    class Product
    {
       string ProductID;
    }

    Dann sieht es wieder anders aus, und die Kurzfassung von Tom wird nicht gehen.
    Wenn doch, bin ich über Tipps offen.
    Danke vorab.
    // Ich möchte wissen, wie viele eindeutige Elemente (ProduktIDs) in beiden Listen gibt.
    foreach (Product posSide2 in listSide2)
    {
     vorhanden = false;
     pruefen= posSide2.ProductID;
     foreach (Product posSide1 in listSide1)
     {
      if (posSide1.ProductID == pruefen)  // String
      {
       vorhanden = true;
      }
     }
     if (vorhanden == false)
      counterProductID++;
    }


    Grüße Martin

    • Bearbeitet Martin Scheid Freitag, 18. November 2016 15:31 Korrektur
    Freitag, 18. November 2016 15:28
  • Hallo Martin,

    wenn es dir nur um die Anzahl der eindeutigen ProductID-Werte geht, dann kannst du diese Eigenschaft vorher mittels Select "heraus holen":

    var count = list1.Select(x => x.ProductID)
    .Union(list2.Select(x => x.ProductID))
    .Count();

    Alternativ kannst du einen eigenen IEqualityComparer<T> implementieren und diesen der LinQ-Methode zum Vergleichen übergeben.

    Bei dem von dir geposteten Code dürfte das Problem sein, das Elemente die in beiden Listen vorhanden sind, gar nicht gezählt werden. Um die Zählung manuell durchzuführen müsste man die Anzahl der Elemente in list1 nehmen und dort drauf die Anzahl der Elemente aus list2 addieren, die nicht in list1 sind.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert Martin Scheid Freitag, 18. November 2016 16:16
    Freitag, 18. November 2016 15:45
    Moderator
  • Hallo Tom,

    prima und Danke.

    Viele Grüße Martin

    Freitag, 18. November 2016 16:02