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
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Creare espressioni riutilizzabili nelle query LINQ per Entity Framework
Utilizzare il metodo Index di LINQ per scorrere una lista sapendo anche l'indice dell'elemento
Utilizzare il metodo ExceptBy per eseguire operazione di sottrazione tra liste
Utilizzare il metodo IntersectBy per eseguire l'intersection di due liste
Usare la libreria PredicateBuilder per eseguire query tramite Entity Framework che usano or su più campi
Mischiare codice server side e client side in una query LINQ con Entity Framework
I più letti di oggi
- Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
- Esaminare documenti XML con namespace utilizzando LINQ to XML
- Gli oggetti CallOut di Expression Blend 4.0
- Sfruttare una CDN con i bundle di ASP.NET
- Le DirectInk API nella Universal Windows Platform
- Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable
- Inserire le news di Punto Informatico nel proprio sito


