Func 如何工作?

我正在创建一个Distinct扩展方法,我可以传递如下标准。

persons.Distinct(p => p.Name); 

我从网上获得了代码,但我很难理解Func的目的。 另外,当我说p => p.Name时,我发送String Name还是发送完整的Person对象? 这是新的Distinct方法:

 public static class ExtensionMethods { public static IEnumerable Distinct( this IEnumerable list, Func checker) { return list.Distinct(new GenericComparer(checker)); } } public class GenericComparer : IEqualityComparer { private Func _checker; public GenericComparer(Func 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() { 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); 

你基本上是在动态创建一个函数( 使用lambda表达式 ),如下所示:

 string theFunction(Person p) { return p.Name; } 

这是一个适合Func委托的签名的函数。 Distinct方法可以使用一个委托(基本上是一个函数指针),它用来确定一个元素是否是不同的 – 在你的情况下,只有唯一的字符串(由上面的函数返回)才会被认为是“不同的”元素。 该委托在可枚举的“人员”的每个元素上运行,并使用这些函数的结果。 然后它从这些元素创建一个序列( IEnumerable )。

 Func 

定义一个接受一个参数(类型为T)并返回一个对象(类型为TResult)的函数。

在你的情况下,如果你想要一个带有Person对象的函数并返回一个字符串…你想要的

 Func 

这相当于:

 string Function(Person p) { return p.Name; } 

如果他们有相同的名字,你假设两个人是相同的,你回到了不同的人

如果您需要一组不同的名称,可以使用:

 IEnumerable names = persons.Select(p => p.Name).Distinct();