Eliminare elementi in comune tra più liste con la clausola Except di LINQ

di Stefano Mostarda, in LINQ, UserScript,

Nei due script precedenti si sono affrontati i problemi dell'unione di oggetti tra liste e della ricerca degli elementi in comune. In questo terzo script viene risolto il problema dell'interrogazione di due liste estrapolandone solo gli elementi non in comune. Per fare questo si deve utilizzare il metodo Except di LINQ.

Come nei casi precedenti, si parte da due liste 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 reimplementazione, le istanze di Persona che hanno lo stesso nome e cognome sono considerate uguali.

A questo punto si può sfruttare il metodo Except per ricercare le persone della lista persone1 che non hanno una corrispondenza nella lista persone2. Questo, però, è insufficiente poichè si recuperano solo gli elementi della lista persone1. Per completare la ricerca bisogna rieseguire il metodo Except invertendo le liste e fondere il risultato delle due query con il metodo Union.

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.Except(persone2).Union(persone2.Except(persone1)) select p;

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

Come si vede dallo script, grazie alle nuove feature del C# 3.0, questo processo richiede solamente una riga di codice. Senza LINQ, una funzione del genere avrebbe costretto lo sviluppatore a ciclare a mano le liste alla ricerca degli elementi.

Per approfondimenti si veda:

Introduzione a LINQ
https://www.winfxitalia.com/articoli/netfx3.5/linq.aspx

#20 - Unire liste tramite il Metodo Union di LINQ
https://www.winfxitalia.com/script/20/Unire-Liste-Tramite-Metodo-Union-LINQ.aspx

#22 - Ricercare elementi in comune tra più liste con la clausola Intersect di LINQ
https://www.winfxitalia.com/script/22/Ricercare-Elementi-Comune-Liste-Clausola-Intersect-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