domingo, 6 de septiembre de 2015

[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.

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 }

La utilizaremos de cualquier de las dos formas siguientes:



  1. list.DistinctBy(item => item.Id);

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

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


 


Saludos
Juanlu

Etiquetas: ,


This page is powered by Blogger. Isn't yours?