Molti metodi di LINQ accettano un tipo che implementa l'interfaccia IEqualityComparer per stabilire quando due oggetti sono uguali. Per default LINQ utilizza l'uguaglianza implicita del .NET Framework ovvero ritiene che due oggetti siano uguali se rappresentano la stessa istanza. Nella realtà, non è sempre così; se abbiamo due oggetti Ordine con lo stesso id per noi
sono identici.
Attraverso una classe che implementa l'interfaccia IEqualityComparer possiamo stabilire noi il criterio di uguaglianza tra oggetti.
public class LambdaComparer<T> : IEqualityComparer<T> { private readonly Func<T, T, bool> _lambda; private readonly Func<T, int> _hash public LambdaComparer(Func<T, T, bool> lambda) : this(lambda, o => 0) { } public LambdaComparer(Func<T, T, bool> lambda, Func<T, int> hash) { _lambda = lambda; _hash = hash; } public bool Equals(T x, T y) { return _lambda(x, y); } public int GetHashCode(T obj) { return _hash(obj); } }
Una volta creata la classe possiamo utilizzarla specificando il criterio di uguaglianza tramite lambda expression.
IEqualityComparer comparer = new LambdaComparer<Order>((x, y) => x.Id == y.Id); List<Order> x = orders.Distinct(comparer).ToList();
Commenti
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
- I lego? Programmabili con .NET!
- Disponibile anche il runtime di ASP.NET 2.0
- Azure Mobile Services: costruire il back-end per le app
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- Release candidate per Expression Blend
- #sqlserver 2008 r2 CTP: report builder 3.0 e #businessintelligence http://u.aspitalia.com/g
- #wcfRIAservices è pronto: http://u.aspitalia.com/d4. se vuoi un'introduzione, la nostra è su http://u.aspitalia.com/d3
- segui live #futuredecoded da Roma dalle 9:30 su http://www.communitydays.it