gpt4 book ai didi

c# - 使用递归创建 (Lambda) 表达式

转载 作者:行者123 更新时间:2023-12-02 16:16:15 25 4
gpt4 key购买 nike

我有以下字典:

Dictionary<string, PropertyInfo> filterProperties;

这个字典的内容可以是这样的:

- "Language": [QueryData.Lang],
- "Id": [Querydata.UserId]

每个字符串键映射到我的 QueryData 的属性类型。

现在假设我有以下 QueryData实例:

QueryData: { Lang= "en", UserId = "mcicero" }

以前面的字典为例,我想构建以下表达式:

e => e.Language == "en" && e.Id == "mcicero";

如您所见,字典键用于访问 e 的属性,字典值(QueryData 属性)用于指定二进制等式表达式中的常量。

e类型为Entity ,并且保证具有此属性。

结果表达式的类型应为 Expression<Func<Entity, bool>>

如何使用递归构建此表达式?

我说递归是因为它听起来像是一种自然的解决方案,但迭代的解决方案是首选。

我尝试了迭代替代方案,但最终得到了一个丑陋且不太容易理解的代码。

但是,我在为这个问题创建递归方法时遇到困难。

最佳答案

将单个表达式的创建留给您,只需将它们组合到一个迭代循环中即可:

// For an IEnumerable<Expression> in "expressions"
Expression left = null;
foreach(var right in expressions)
{
if(left == null)
left = right;
else
left = Expression.And(left, right);
}
// Combined expression is in "left"
// Don't forget it will be null if there were no expressions provided...

或者使用 LINQ 在一行中:

var expr = expressions.Aggregate(Expression.And);

关于c# - 使用递归创建 (Lambda) 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31341493/

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