使用C#Expression Evaluator过滤列表

男孩先生

我们有一个,List<SomeType>并且希望能够对它执行不同的操作,例如选择满足某些条件的元素。我们希望这些测试由用户以文本形式提供,因此正在研究C#Expression Evaluator

它当然可以用于此目的,但是我很难确定csharpeval使用LINQ时是否可以将委托用作lambda。我们希望将存储的表达式应用于每个对象。

例如Just"o.FirstName == "Tom"并且不像那样存储整个列表表达式list.Where(o => o.FirstName == 'Tom')

提供了一次编译表达式并针对不同输入数据运行的方法,ScopeCompile但是我不确定它们是否与lambda方法兼容。谁能帮我吗?

艳丽的

我这就是你想要的:

var expression = new CompiledExpression<bool>("MyProperty > 10");
var func = expression.ScopeCompile<MyClass>();

用法示例:

class MyClass
{
    public int MyProperty { get; set; }
}
var list = Enumerable.Range(1, 50).Select(x => new MyClass { MyProperty = x });

var expression = new CompiledExpression<bool>("MyProperty > 10");
var func = expression.ScopeCompile<MyClass>();

var filtered = list.Where(p => func(p));

Console.WriteLine(filtered.Count()); //40

您可以创建一个辅助函数来创建lambda函数:

Func<T, bool> GetLambda<T>(string inputExp)
{
    var expression = new CompiledExpression<bool>(inputExp);
    return expression.ScopeCompile<T>();
}

用法:

var func = GetLambda<People>("Id < 5");
Peoples.Where(p => func(p)).Dump();

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章