// See https://aka.ms/new-console-template for more information using Microsoft.CSharp; using NCalc; using System.CodeDom.Compiler; using System.Diagnostics; using System.Reflection; using System.Text; using System.Text.RegularExpressions; using Z.Expressions; System.Threading.Thread.Sleep(1000); //Console.WriteLine(@" 首重 = 0.5, // 续重 = 0.5, // 称重 = 1.000, // 体重 = 2.000, // 首重价格 = 100, // 续重价格 = 200"); //string f = "(称重 > 体重 ? 称重 : 体重) > 首重 ? (首重价格 + (称重 > 体重 ? ([(称重 - 首重) / 续重] * 续重价格) : ([(体重 - 首重) / 续重] * 续重价格))): 首重价格"; //Console.WriteLine($"公式1:{f}"); //for (int i = 0; i < 5; i++) //{ // Stopwatch all = new Stopwatch(); // all.Start(); // System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(@"(\[.*?\])"); // var maths = r.Matches(f); // if (maths.Count > 0) // { // foreach (Match math in maths) // { // f = f.Replace(math.Groups[1].Value, math.Groups[1].Value.Replace("[", "Math.Ceiling(").Replace("]", ")")); // } // } // Console.WriteLine(Eval.Execute(f, new // { // 首重 = 0.5, // 续重 = 0.5, // 称重 = i, // 体重 = 2.000, // 首重价格 = 100, // 续重价格 = 200, // })); // all.Stop(); // Console.WriteLine(string.Format("Z.Expressions运算符:用时{0}毫秒{1}", all.Elapsed.TotalMilliseconds, 100 * 100)); //} string f3 = "Math.Max(体重,称重)>首重?首重价格+Math.Ceiling((Math.Max(称重 , 体重) - 首重) / 续重) * 续重价格:首重价格"; //string f3 = "(称重 > 体重 ? 称重 : 体重) > 首重 ? (首重价格 + (称重 > 体重 ? ([(称重 - 首重) / 续重] * 续重价格) : ([(体重 - 首重) / 续重] * 续重价格))): 首重价格"; Console.WriteLine($"公式2:{f3}"); for (int i = 0; i < 5; i++) { Stopwatch all = new Stopwatch(); all.Start(); var interpreter = new DynamicExpresso.Interpreter(); Console.WriteLine(interpreter.Eval(f3, new DynamicExpresso.Parameter[] { new DynamicExpresso.Parameter("首重",typeof(double),0.5), new DynamicExpresso.Parameter("续重",typeof(double),0.5), new DynamicExpresso.Parameter("称重",typeof(double),i), new DynamicExpresso.Parameter("体重",typeof(double),2.000), new DynamicExpresso.Parameter("首重价格",typeof(double),100), new DynamicExpresso.Parameter("续重价格",typeof(double),200), })); all.Stop(); Console.WriteLine(string.Format("DynamicExpresso函数:用时{0}毫秒{1}", all.Elapsed.TotalMilliseconds, 100 * 100)); } string f2 = "if(Max(体重,称重)>首重,首重价格+Ceiling((Max(称重 , 体重) - 首重) / 续重) * 续重价格,首重价格)"; Console.WriteLine("公式3:" + f2); for (int i = 0; i < 5; i++) { Console.WriteLine(i); Stopwatch all = new Stopwatch(); all.Start(); string f22 = f2 .Replace("首重价格", 100.ToString()) .Replace("续重价格", 200.ToString()) .Replace("首重", 0.5.ToString()) .Replace("续重", 0.5.ToString()) .Replace("称重", i.ToString()) .Replace("体重", 2.000.ToString()); Expression evaluator = new Expression(f22); Console.WriteLine(evaluator.Evaluate()); all.Stop(); Console.WriteLine(string.Format("NCalc.函数计算:用时{0}毫秒{1}", all.Elapsed.TotalMilliseconds, 100 * 100)); } Console.Read(); //(称重 > 体重 ? 称重 : 体重) > 首重 ? (首重价格 + (称重 > 体重 ? ([(称重 - 首重) / 续重] * 续重价格) : ([(体重 - 首重) / 续重] * 续重价格))): 首重价格