Estoy creando un método de extensión Distinto donde puedo pasar los criterios como el siguiente.¿Cómo funciona Func <T,TResult>?
persons.Distinct(p => p.Name);
que tiene el código de la web, pero estoy teniendo dificultades para comprender el propósito de Func<T, TResult>
. Además, cuando digo p => p.Name
estoy enviando el String
Name
o estoy enviando el objeto completo Person
? Aquí está el nuevo método distinto:
public static class ExtensionMethods
{
public static IEnumerable<T> Distinct<T>(
this IEnumerable<T> list, Func<T,object> checker)
{
return list.Distinct(new GenericComparer<T>(checker));
}
}
public class GenericComparer<T> : IEqualityComparer<T>
{
private Func<T, object> _checker;
public GenericComparer(Func<T,object> checker)
{
_checker = checker;
}
public bool Equals(T x, T y)
{
return _checker(x).Equals(_checker(y));
}
public int GetHashCode(T obj)
{
return _checker(obj).GetHashCode();
}
}
Y aquí está el uso:
static void Main(string[] args)
{
var persons = new List<Person>()
{
new Person() { Id = 1, Name = "Mary"},
new Person() {Id = 2, Name="John"},
new Person() { Id = 3, Name = "Mary"}
};
var uniquePersons = persons.Distinct(p => p.Name);
foreach(var person in uniquePersons)
{
Console.WriteLine(person.Name);
}
}
+1, pero "En su caso, un elemento es distinto si ningún otro elemento tiene el mismo' Nombre'. Si más de un elemento en la fuente tiene el mismo nombre, solo el primero de ellos estará presente en el resultado. "Además, ninguna sobrecarga del método' Distict() 'toma un selector. ¿Escribiste el tuyo? –
La pregunta OP muestra cómo se define la extensión Distinct ... – ShuggyCoUk
Sí, tengo un método de extensión Distinct de Internet! No lo escribí yo mismo! –