繁体   English   中英

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

[英]How can I use dynamic condition in Lambda expression

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

Test2 tt = new Test2();
tt.s2 = "TEST1";
tt.s3 = "TEST2";
tt.s4 = "TEST3";

Test2 tt1 = new Test2();
tt1.s2 = "TEST11";
tt1.s3 = "TEST21";
tt1.s4 = "TEST31";

Test2 tt2 = new Test2();
tt2.s2 = "TEST12";
tt2.s3 = "TEST22";
tt2.s4 = "TEST32";

List<Test2> test = new List<Test2>();
test.Add(tt);
test.Add(tt1);
test.Add(tt2);

var cond = "item => item.s2 == TEST1";
var test2List = test.Select(item => cond);

因此,有人可以建议我如何实现这个动态概念吗?

如果您试图将条件表示为字符串,那么动态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

你可以做类似的事情

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)

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

根据此页面 ,您可以使用名为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();

我不确定我了解您想要什么,但我会尽力的。

可以说您的配置是这样的:

"s2 == TEST1"

在其他时间:

"s3 == TEST2"

因此,您需要创建Predict<Test2> ,主体将像这样:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM