Molto spesso ci si trova davanti all'esigenza di dover eseguire diverse operazioni su due o più liste. Ad esempio, si potrebbero dover unire le liste eliminando i doppioni o cercare i dati presenti in una e non nell'altra o ancora cercare solo quelli in comune. LINQ permette di effettuare queste operazioni con semplicità.
In questo script vengono create due liste di oggetti Persona e vengono unite eliminando i doppioni sfruttando il metodo Union.
Il primo passo è creare la classe Persona che contiene le proprietà Nome e Cognome e che sovrascrive i metodi GetHashCode e Equals per l'uguaglianza tra diverse istanze della classe. Questi due metodi sono molto importanti ai fini dell'eliminazione dei doppioni.
public class Persona { public string Nome { get; set; } public string Cognome { get; set; } public override bool Equals(object obj) { Persona p = (Persona)obj; return Nome == p.Nome && Cognome == p.Cognome; } public override int GetHashCode() { return Nome.GetHashCode() ^ Cognome.GetHashCode(); } }
Il secondo passo è creare le liste e fonderle in una sola.
System.Collections.Generic.List<Persona> persone1 = new System.Collections.Generic.List<Persona>{ new Persona { Nome = "Stefano", Cognome = "Mostarda" }, new Persona { Nome = "Daniele", Cognome = "Bochicchio" }, new Persona { Nome = "Riccardo", Cognome = "Golia" }, new Persona { Nome = "Cristian", Cognome = "Civera" }, new Persona { Nome = "Marco", Cognome = "Leoncini" } }; System.Collections.Generic.List<Persona> persone2 = new System.Collections.Generic.List<Persona>{ new Persona { Nome = "Alessio", Cognome = "Leoncini" }, new Persona { Nome = "Andrea", Cognome = "Zani" }, new Persona { Nome = "Stefano", Cognome = "Mostarda" }, new Persona { Nome = "Cristian", Cognome = "Paparelli" }, new Persona { Nome = "Ugo", Cognome = "Lattanzi" }, new Persona { Nome = "Cristian", Cognome = "Civera" }, }; var q = persone1.Union(persone2);
E' importante notare che se non ci fossero i metodi GetHashCode ed Equals sovrascritti nella classe Persona, l'eliminazione dei doppioni si sarebbe potuta raggiungere utilizzando la firma del metodo Union che prevede anche il passaggio di una classe che implementa l'interfaccia IEqualityComparer.
Per approfondimenti si veda:
Introduzione a LINQ
https://www.winfxitalia.com/articoli/netfx3.5/linq.aspx
#14 - Eseguire query con LINQ
https://www.winfxitalia.com/script/14/Eseguire-Query-LINQ.aspx
#16 - Anonymous Type con LINQ
https://www.winfxitalia.com/script/16/Anonymous-Type-LINQ.aspx
#18 - Eseguire raggruppamenti tramite Group By con LINQ
https://www.winfxitalia.com/script/18/Eseguire-Raggruppamenti-Tramite-Group-BY-LINQ.aspx
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Utilizzare il metodo Index di LINQ per scorrere una lista sapendo anche l'indice dell'elemento
Change tracking e composition in Entity Framework
Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
Utilizzare il metodo ExceptBy per eseguire operazione di sottrazione tra liste
Utilizzare il metodo IntersectBy per eseguire l'intersection di due liste