Ricercare elementi in comune tra più liste con la clausola Intersect di LINQ

di Stefano Mostarda, in LINQ, UserScript,

Nello script precedente si è visto come con LINQ si possano fondere più liste in una sola. In questo script, apporteremo una differenza da utilizzare quando si vogliono recuperare solo gli oggetti in comune ad entrambe le liste tramite il metodo Intersect.

Anche in questo caso si usa una lista di oggetti Persona che è una classe con le proprietà Nome e Cognome e con i metodi Equals e GetHashCode, reimplementati per garantire una corretta comparazione tra gli oggetti. Grazie a questa implementazione, le istanze di Persona che hanno lo stesso nome e cognome sono considerate uguali.

L'ultimo passo consiste nello sfruttare la clausola Intersect per ricercare le persone della prima lista presenti anche nella seconda e quella select per estrarre l'intero oggetto.

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 = from p in persone1.Intersect(persone2) select p;

lv.DataSource = q;
lv.DataBind();

Un'operazione del genere senza LINQ avrebbe comportato la scrittura di diverso codice. Infatti, per arrivare allo stesso risultato si sarebbe dovuto ciclare ogni elemento della lista persone1 e per ognuno ciclare la lista persone2 per trovare quello con lo stesso nome e cognome.

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 con tramite Group By con LINQ
https://www.winfxitalia.com/script/18/Eseguire-Raggruppamenti-Tramite-Group-BY-LINQ.aspx

#20 - Unire liste tramite il Metodo Union di LINQ
https://www.winfxitalia.com/script/20/Unire-Liste-Tramite-Metodo-Union-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