Verifica dei duplicati in un oggetto complesso usando l'espressione Linq o Lambda
-
03-07-2019 - |
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.
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>
.