Sto creando un metodo di estensione Distinta in cui posso passare i criteri come il seguente.Come funziona Func <T,TResult>?
persons.Distinct(p => p.Name);
ho ottenuto il codice dal web, ma sto avendo difficoltà a capire lo scopo della Func<T, TResult>
. Inoltre, quando dico p => p.Name
sto inviando il String
Name
o sto inviando l'oggetto completo Person
? Ecco il nuovo metodo distinte:
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();
}
}
E qui è l'utilizzo:
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, ma "Nel tuo caso, un elemento è distinto se nessun altro elemento ha lo stesso' Nome'. Se più di un elemento nella sorgente ha lo stesso nome, solo il primo di essi sarà presente nel risultato. "Inoltre, nessun sovraccarico del metodo' Distict() 'prende un selettore - hai scritto il tuo? –
il La domanda OP mostra come viene definita l'estensione Distinct ... – ShuggyCoUk
Sì, ho ottenuto un metodo di estensione Distinto di Internet! Non l'ho scritto io stesso! –