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
Utilizzare il metodo IntersectBy per eseguire l'intersection di due liste
Utilizzare il metodo ExceptBy per eseguire operazione di sottrazione tra liste
Change tracking e composition in Entity Framework
Utilizzare il metodo CountBy di LINQ per semplificare raggruppamenti e i conteggi
Utilizzare il metodo Index di LINQ per scorrere una lista sapendo anche l'indice dell'elemento
I più letti di oggi
- .NET Conference Italia 2024 - Milano
- Develop and distribute Azure Functions using K8s and CI/CD
- Disponibile la versione finale di Hyper-V: la virtualizzazione per Windows Server 2008
- Speciale Mastering Entity Framework
- Velocity arriva alla CTP3
- Silverlight Summer: un'estate speciale piena di Style per i controlli Silverlight!
- Disponibile la versione beta di Silverlight 4.0
- Mono 0.13: ora anche web services
- .NET Alerts Software Development Kit