Tworzę metodę Distinct extension, w której mogę spełnić następujące kryteria.Jak działa Func <T,TResult>?
persons.Distinct(p => p.Name);
mam kod z sieci, ale mam trudności ze zrozumieniem cel Func<T, TResult>
. Ponadto, gdy mówię: p => p.Name
, wysyłam String
Name
lub czy wysyłam cały obiekt Person
? Oto nowa metoda Wyraźny:
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();
}
}
I tu jest użycie:
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, ale "W twoim przypadku element jest inny, jeśli żaden inny element nie ma tego samego" Nazwa ". Jeśli więcej niż jeden element w źródle ma taką samą nazwę, tylko pierwszy z nich będzie obecny w wyniku. "Ponadto, żadne przeciążenie metody' Distict() 'nie bierze selektora - czy napisałeś własny? –
Pytanie OP pokazuje, jak zdefiniowano Distinct rozszerzenie ... – ShuggyCoUk
Tak, mam Distinct rozszerzenie metody Internetu! Nie napisałem go samodzielnie! –