// 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();
//(称重 > 体重 ? 称重 : 体重) > 首重 ? (首重价格 + (称重 > 体重 ? ([(称重 - 首重) / 续重] * 续重价格) : ([(体重 - 首重) / 续重] * 续重价格))): 首重价格
