Creare un comparer generico tramite Lambda per LINQ

di Stefano Mostarda, in LINQ,

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

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

Nessuna risorsa collegata

I più letti di oggi