c# - Func<T,TResult> 是如何工作的?

标签 c# lambda

我正在创建一个 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/

相关文章:

c# - 如何在 VSIX 扩展中处理 VSTS 凭据

c# - 使用静态时出现 "An object reference is required to access non-static member"错误

java - 为什么我的 java lambda 表达式不能工作,而它的命令式风格可以正常工作?

python - 如何制作线性函数的反函数

python - 如何使用 apply 函数和 lambda 函数将列表的值添加到列值?

python - lambda 与列表理解性能

c# - 在对象之间共享引用

c# - 无法使用 C# 和 SSH.NET 从 Windows 运行 Unix 服务器中的用户脚本

c# - 对象引用未设置为对象的实例。(C# Web 应用程序)

java - 当变量是由于调用提供 lambda 的方法而被赋值时,如何在 lambda 中使用变量?