Domanda

Ho appena iniziato a imparare le espressioni linq e lambda, e sembrano essere adatte per trovare duplicati in una complessa raccolta di oggetti, ma mi sto confondendo un po 'e spero che qualcuno possa aiutarmi a rimettermi in cammino alla felice codifica.

Il mio oggetto è strutturato come list.list.uniqueCustomerIdentifier

Devo assicurarmi che non ci siano duplicati uniqueCustomerIdentifier con nell'intero oggetto complesso. Se ci sono duplicati, devo identificare quali sono duplicati e restituire un elenco dei duplicati.

È stato utile?

Soluzione

  • Decomprimi la gerarchia
  • Proietta ogni elemento sulla sua proprietà uniqueID
  • Raggruppa questi ID su
  • Filtra i gruppi per gruppi che hanno più di 1 elemento
  • Proietta ciascun gruppo sulla chiave del gruppo (torna a uniqueID)
  • Enumera la query e archivia il risultato in un elenco.

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()

Altri suggerimenti

Esiste un operatore linq Distinct (), che consente di filtrare fino a un set distinto di record se si desidera solo gli ID. Se hai impostato la tua classe per l'override è uguale a te o hai un IEqualityComparer puoi chiamare direttamente il metodo di estensione Distinct per restituire i risultati univoci dall'elenco. Come bonus aggiuntivo puoi anche utilizzare i metodi Union e Intersect per unire o filtrare tra due elenchi.

Un'altra opzione sarebbe quella di raggruppare per id e quindi selezionare il primo elemento.

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

Se si desidera appiattire le due gerarchie di elenchi, utilizzare il metodo SelectMany per appiattire un IEnumerable<IEnumerable<T>> in IEnumerable<T>.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top