我正在创建一个 Distinct 扩展方法,我可以在其中传递如下条件。
persons.Distinct(p => p.Name);
我从网上获得了代码,但我很难理解 Func<T, TResult>
的用途.另外,当我说 p => p.Name
我要发送 String
吗? Name
还是我发送完整的 Person
目的?这是新的 Distinct 方法:
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();
}
}
这里是用法:
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);
}
}
最佳答案
当你这样做时:
persons.Distinct(p => p.Name);
您基本上是在动态创建一个函数 (using lambda expressions),它看起来像这样:
string theFunction(Person p)
{
return p.Name;
}
这是一个适合 Func<Person,String>
签名的函数代表。 Distinct 方法可以接受一个委托(delegate)(基本上是一个函数指针),它用于确定元素是否不同 - 在您的情况下,只有唯一字符串(由上面的函数返回)将被视为“不同”元素。该委托(delegate)在可枚举的“人员”的每个元素上运行,并使用这些函数的结果。然后它从这些元素创建一个序列 ( IEnumerable<Person>
)。
关于c# - Func<T,TResult> 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1213527/