Benutzer mit den meisten Antworten
2 Listen -> 1 unique Liste

Frage
Antworten
-
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
- Als Antwort vorgeschlagen Tom Lambert (Koopakiller)Moderator Freitag, 18. November 2016 11:39
- Als Antwort markiert Martin Scheid Freitag, 18. November 2016 16:16
-
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
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
-
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- Bearbeitet Tom Lambert (Koopakiller)Moderator Freitag, 18. November 2016 00:04
-
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
- Als Antwort vorgeschlagen Tom Lambert (Koopakiller)Moderator Freitag, 18. November 2016 11:39
- Als Antwort markiert Martin Scheid Freitag, 18. November 2016 16:16
-
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
-
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