c# - 如何通过比较将 lambda 表达式传递给 where 语句

标签 c# lambda

假设我有这门课

public class Person
{
    public int PhoneNumber { get; set; }
    public string Name { get; set; }
}

我想编写一个方法,可以根据 Person 的属性和比较字段返回用户列表。

private List<Person> GetResult(Func<Person, object> p, string v)
{
       List<Person> data = GetResultsFromDb();
       return data.Where(p == v);
}

例如,如果我想获取所有名为 Mike 的人,我可以说

var result = GetResult(a => a.Name, "Mike");

或者,如果我想根据电话号码获取结果,我可以说

var result = GetResult(a => a.PhoneNumber, 123);

但是我越来越

Operator == cannot be applied to operands of type 'Expression<Func<Person, object>>' and string

最佳答案

p的参数是代表。这种类型与 string 相比效果不佳(因此你的错误消息)。您需要调用委托(delegate)来获取值。但是,对象的返回类型对于比较而言并不是最佳的。所以你应该使你的方法通用。现在你是通用的,你不能使用相等运算符 == ,但您可以使用 Equals 。最后你需要调用ToList匹配方法的返回类型:

private List<Person> GetResult<T>(Func<Person, T> p, T v)
{
       List<Person> data = GetResultsFromDb();
       return data.Where(item => p(item).Equals(v)).ToList();
}

由于参数v类型为T , T当你调用该方法时可以推断出。这意味着您可以省略类型参数,因此可以使用 GetResult(a => a.Name, "Mike")而不是GetResult<string>(a => a.Name, "Mike") .

一些 .NET 专业人士可能会提示,当您调用 Equals 时,您不需要该方法是通用的。 ,自 Equals定义于 Object 。您还可以指出这样一个事实:null 的比较值将不起作用,并且 IEquatable实现没有给予任何特殊考虑。如果您想避免所有这些投诉,您可以使用EqualityComparer进行比较:

private List<Person> GetResult<T>(Func<Person, T> p, T v)
{
       List<Person> data = GetResultsFromDb();
       return data.Where(item => EqualityComparer<T>.Default.Equals(p(item), v)).ToList();
}

关于c# - 如何通过比较将 lambda 表达式传递给 where 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42624373/

相关文章:

c# - 如何在 Visual Studio 中使用 .NET 5(独立进程)调试 Azure Functions?

Java 8 : Method as parameter with Lambda reference

c# - 使用 C# 将 Lambda 表达式转换为 SQL UPDATE 语句

asp.net-mvc - ASP.NET BeginForm() 表达式语法

c# - <List> 的可访问性不一致

javascript - 现在的 ASP.NET Javascript 框架

c# - 使用 CSVhelper C# 合并具有不同 header 的 CSV 文件

c# - .NET Lambda 传递方法参数

c# - 这段代码的解释

c# - MongoClient GetServer/GetDatabase 与 ReplicaSet 的最佳实践