gpt4 book ai didi

c# - 如何编写现有的 Linq 表达式

转载 作者:可可西里 更新时间:2023-11-01 08:41:51 28 4
gpt4 key购买 nike

我想组合两个 Linq 表达式的结果。它们以形式存在

Expression<Func<T, bool>>

所以我想组合的两个本质上是对一个参数(T 类型)的委托(delegate),它们都返回一个 bool 值。我想要的结果是 bool 值的逻辑评估。我可能会将其实现为扩展方法,因此我的语法类似于:

Expression<Func<User, bool>> expression1 = t => t.Name == "steve";
Expression<Func<User, bool>> expression2 = t => t.Age == 28;
Expression<Func<User, bool>> composedExpression = expression1.And(expression2);

稍后在我的代码中我想计算组合表达式

var user = new User();
bool evaluated = composedExpression.Compile().Invoke(user);

我已经探索了一些不同的想法,但我担心它比我希望的要复杂。这是怎么做到的?

最佳答案

这是一个例子:

var user1 = new User {Name = "steve", Age = 28};
var user2 = new User {Name = "foobar", Age = 28};

Expression<Func<User, bool>> expression1 = t => t.Name == "steve";
Expression<Func<User, bool>> expression2 = t => t.Age == 28;

var invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());

var result = Expression.Lambda<Func<User, bool>>(Expression.And(expression1.Body, invokedExpression), expression1.Parameters);

Console.WriteLine(result.Compile().Invoke(user1)); // true
Console.WriteLine(result.Compile().Invoke(user2)); // false

您可以通过扩展方法重用此代码:

class User
{
public string Name { get; set; }
public int Age { get; set; }
}

public static class PredicateExtensions
{
public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> expression1,Expression<Func<T, bool>> expression2)
{
InvocationExpression invokedExpression = Expression.Invoke(expression2, expression1.Parameters.Cast<Expression>());

return Expression.Lambda<Func<T, bool>>(Expression.And(expression1.Body, invokedExpression), expression1.Parameters);
}
}

class Program
{
static void Main(string[] args)
{
var user1 = new User {Name = "steve", Age = 28};
var user2 = new User {Name = "foobar", Age = 28};

Expression<Func<User, bool>> expression1 = t => t.Name == "steve";
Expression<Func<User, bool>> expression2 = t => t.Age == 28;

var result = expression1.And(expression2);

Console.WriteLine(result.Compile().Invoke(user1));
Console.WriteLine(result.Compile().Invoke(user2));
}
}

关于c# - 如何编写现有的 Linq 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53597/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com