如何在Lambda表达式中使用动态条件

时间:2016-03-29 12:10:51

标签: c# lambda

我需要在config中配置条件,同样的东西将用作lambda表达式Where子句的条件。 下面是我尝试的代码,但所有列表项都设置了这个值。

'ê'

那么,任何人都可以建议我如何实现这一动态概念?

4 个答案:

答案 0 :(得分:1)

如果您尝试将条件表示为字符串,则动态LINQ可以为您执行此操作。如果您引用System.Linq.Dynamic,那么您可以编写类似

的条件
var cond = "s2 == \"TEST1\"";
var test2List = test.Where(cond);
test2List.ToList().ForEach(_ => Console.WriteLine($"{_.s2}, {_.s3}. {_.s4}"));


cond = "s2 == \"TEST1\" || s2 == \"TEST12\"";
test2List = test.Where(cond);
test2List.ToList().ForEach(_ => Console.WriteLine($"{_.s2}, {_.s3}. {_.s4}"));

产生

TEST1, TEST2. TEST3
TEST1, TEST2. TEST3
TEST12, TEST22. TEST32

答案 1 :(得分:0)

您可以执行类似

的操作
var filters = new List<Func<f_results, bool>>();
if (s2test) filters.Add(x => x.s2 == myvar);
if (s3test) filters.Add(x => x.s3 == myvar2);
test.Where (item => filters.All(item));

您可以根据需要添加多个过滤器,在各种条件下,它取决于动态但你可以做到

if (s2test & s2equals) filters.Add(x => x.s2 == myvar) else if (!s2equals) filters.Add(x => x.s2 != myvar)

等因此,如果需要,您可以使用开关来构建语句。

答案 2 :(得分:0)

根据this page,您可以使用名为Dynamic Expresso的开源库从字符串创建lambda表达式。

var prices = new [] { 5, 8, 6, 2 };

var whereFunction = new Interpreter()
    .ParseAsDelegate<Func<int, bool>>("arg > 5");

var count = prices.Where(whereFunction).Count();

答案 3 :(得分:0)

我不确定我理解你想要什么,但我会尝试。

让我们说你的配置是这样的:

"s2 == TEST1"

其他时间:

"s3 == TEST2"

所以你需要创建Predict<Test2>,身体将是这样的:

var value= item.GetType().GetField("yourConfigField").GetValue(item);
return value == yourConfigValue;

yourConfigFiled为s2或s3且yourConfigValue为TEST1或TEST2时