[TIP] Mejorando Linq. Un Comparador genérico y un “DistinctBy” !!!

Intentando utilizar el “Distinct” de Linq, me he encontrado con la necesidad te tener que implementar una clase “IEqualityComparer<T>”. Concretamente tenía que obtener objetos distintos en una gran lista. Así que, después de buscar un poco, y gracias a nuestro compañero driis, me gustaría compartir la siguiente clase con vosotros. Creo que puede comenzar a formar parte de nuestros desarrollos.

La utilizaremos de cualquier de las dos formas siguientes:

  1. list.DistinctBy(item => item.Id);
    1 public static class Compare 2 { 3 public static IEnumerable<T> DistinctBy<T, TIdentity>(this IEnumerable<T> source, Func<T, TIdentity> identitySelector) 4 { 5 return source.Distinct(Compare.By(identitySelector)); 6 7 public static IEqualityComparer<TSource> By<TSource, TIdentity>(Func<TSource, TIdentity> identitySelector) 8 { 9 return new DelegateComparer<TSource, TIdentity>(identitySelector); 10 } 11 12 private class DelegateComparer<T, TIdentity> : IEqualityComparer<T> 13 { 14 private readonly Func<T, TIdentity> identitySelector; 15 16 public DelegateComparer(Func<T, TIdentity> identitySelector) 17 { 18 this.identitySelector = identitySelector; 19 } 20 21 public bool Equals(T x, T y) 22 { 23 return Equals(identitySelector(x), identitySelector(y)); 24 } 25 26 public int GetHashCode(T obj) 27 { 28 return identitySelector(obj).GetHashCode(); 29 } 30 } 31 }

  2. list.Distinct(Compare.By(item => item.Id));

O incluso, cada vez que necesitemos un “IEqualityComparer<T>” como parámetro.

 

Saludos

Juanlu

Leave a Reply

Your email address will not be published. Required fields are marked *