Frage

Ich habe nur zu lernen, begann Linq und Lambda-Ausdrücke, und sie scheinen eine gute Passform für die Suche nach Duplikaten in einem komplexen Objektsammlung zu sein, aber ich bin immer ein wenig verwirrt und hoffe jemand kann mir helfen, auf dem Weg zurücklegen zu glücklich Codierung.

Meine Aufgabe wird wie list.list.uniqueCustomerIdentifier strukturiert

Ich brauche, um sicherzustellen, gibt es keinen doppelten uniqueCustomerIdentifier mit im gesamten Komplex Objekt ist. Wenn es Duplikate sind, muss ich feststellen, welche dupliziert werden und eine Liste der Duplikate zurück.

War es hilfreich?

Lösung

  • Entpacken Sie die Hierarchie
  • Projekt jedes Element auf seine uniqueID Eigenschaft
  • Gruppen diese IDs bis
  • Filtern der Gruppen von den Gruppen, die mehr als 1 Element
  • haben
  • Projekt jede Gruppe auf die Taste der Gruppe (zurück zur uniqueID)
  • Aufzählen die Abfrage und das Ergebnis in einer Liste an.

var result = 
  myList
    .SelectMany(x => x.InnerList)
    .Select(y => y.uniqueCustomerIdentifier)
    .GroupBy(id => id)
    .Where(g => g.Skip(1).Any())
    .Select(g => g.Key)
    .ToList()

Andere Tipps

Es gibt eine Linq Operator Distinct (), die Sie auf eine bestimmte Gruppe von Datensätzen zu filtern nach unten erlaubt, wenn nur die IDs wollen. Wenn Sie Setup Ihre Klasse außer Kraft zu setzen gleich Sie oder haben eine IEqualityComparer Sie können direkt auf die Distinct-Extension-Methode aufrufen, um die einzigartigen Ergebnisse aus der Liste zurückzukehren. Als zusätzlichen Bonus können Sie auch die Union und Intersect Methoden verwenden, um zwischen zwei Listen zu fusionieren oder filtern.

Eine weitere Möglichkeit zur Gruppe mit der ID wäre dann das erste Element auszuwählen.

var results = from item in list
              group item by item.id into g
              select g.First();

Wenn Sie die beiden Planhierarchien glätten wollen, verwenden Sie die SelectMany Methode eine IEnumerable<IEnumerable<T>> in IEnumerable<T> abzuflachen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top