NetCore中使用DynamicExpresso、Z.Expressions、LambdaParser进行安字符串求值
例子如下:
Z.Expressions从2.0开始支持了NetCore,但是收费的。其它两者免费。建议使用DynamicExpresso,免费而且速度快。LambdaParser目前支持太少。
static void Main(string[] args) { Console.OutputEncoding = Encoding.Unicode; System.Diagnostics.Stopwatch sp = new Stopwatch(); sp.Start(); var code = "i<100&&s.Contains(\"测试\")"; var interpreter = new DynamicExpresso.Interpreter(); var result = interpreter.ParseAsDelegate<Func<int, string, bool>>(code, "i", "s"); //var result = interpreter.ParseAsExpression<Func<int, string, bool>>(code, "i", "s").Compile(); for (int i = 0; i < 18000000; i++) { var v = result(i, "我在测试" + i);//2213ms //Console.WriteLine(v); } sp.Stop(); Console.WriteLine("time:" + sp.ElapsedMilliseconds + "ms"); //System.Diagnostics.Stopwatch sp = new Stopwatch(); //sp.Start(); ////var code = @" //// var list = new List<int>() { 1, 2, 3, 4, x }; //// var filter = list.Where(x => x < 4); //// return filter.Sum(x => x); "; //var code = "i<100&&s.Contains(\"测试\")"; ////var result = Z.Expressions.Eval.Compile<Func<int, string, bool>>(code, "i", "s"); //for (int i = 0; i < 100000; i++) //{ // var v = result(i, "我爱测试"); // //Console.WriteLine(v); //} //sp.Stop(); //Console.WriteLine("time:" + sp.ElapsedMilliseconds + "ms"); //var parse = new LambdaParser(); //while (true) //{ // try // { // Console.WriteLine(new string('_', 20)); // var dics = new Dictionary<string, object>(); // dics.Add("x1", 32.0); // dics.Add("x2", 23.0); // dics.Add("x3", 34.5); // dics.Add("x4", 34.5); // dics.Add("s1", "my name is xxxxzhu!"); // dics.Add("b1", true); // foreach (var item in dics) // { // Console.WriteLine(item.Key + "\t" + item.Value); // } // Console.WriteLine(new string('_', 20)); // Console.WriteLine("expr:"); // var expr = Console.ReadLine(); // var value = parse.Eval(expr, dics); // Console.WriteLine("value======================" + value); // } // catch (Exception ex) { Console.WriteLine("error====================:" + ex.Message); } //} }
宋兴柱:转载内容,请标明出处,谢谢!源文来自 宝贝云知识分享:https://www.dearcloud.cn