Unire liste tramite il Metodo Union di LINQ

di Stefano Mostarda, in LINQ, UserScript,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi