使用 C# Expression Evaluator 过滤列表
Use C# Expression Evaluator for filtering a list
我们有一个 List<SomeType>
并希望能够对其进行 运行 不同的操作,例如选择符合某些条件的元素。我们希望这些测试由用户以文本形式提供,因此正在查看 C# Expression Evaluator.
它当然可以用于此目的,但我很难判断在使用 LINQ 时是否可以将 csharpeval
委托用作 lambda。我们希望将存储的表达式应用于每个对象。
例如只是 "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();
我们有一个 List<SomeType>
并希望能够对其进行 运行 不同的操作,例如选择符合某些条件的元素。我们希望这些测试由用户以文本形式提供,因此正在查看 C# Expression Evaluator.
它当然可以用于此目的,但我很难判断在使用 LINQ 时是否可以将 csharpeval
委托用作 lambda。我们希望将存储的表达式应用于每个对象。
例如只是 "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();