NReco.LambdaParser使用案例

使用案例集合:

cs 复制代码
 private async void RuleEngine_Click(object sender, EventArgs e)
        {
            #region 获取变量
            string expression = this.Rule.Text.Trim();
            string pattern = @"\$(.*?)\$";
            MatchCollection matches = Regex.Matches(expression, pattern);
            foreach (Match match in matches)
            {
                string variableName = match.Groups[1].Value;
            }
            #endregion

            #region 执行器初始化
            var lambdaParser = new LambdaParser();
            lambdaParser.AllowVars = true;
            #endregion

            #region 变量初始化
            var tagsql = string.Empty;
            var dictLast = new Dictionary<string, object>();
            #endregion

            #region 常用方法与数据定义
            dictLast["PI"] = 3.14M;
            dictLast["Now"] = DateTime.Now;
            dictLast["Not"] = (Func<bool, bool>)((t) => !t);
            dictLast["Max"] = (Func<decimal, decimal, decimal>)((a, b) => Math.Max(a, b));
            dictLast["Yes"] = true;
            dictLast["No"] = false;
            dictLast["arr"] = new double[] { 1.5, 2.5 };
            dictLast["dic"] = new Dictionary<string, int>()
            {
                {"apple", 1},
                {"banana", 2},
                {"orange", 3}
            };
            dictLast["Alert"] = (Func<string, string>)((msg) => AlertAsync(msg));
            #endregion

            #region 判断字符是否正确输入
            string input = "Now.ToString(\"yyyy-MM-dd/HH\")";
            string backslash = @"(?<!\\)"""; // 匹配没有被转义的双引号
            MatchCollection matches2 = Regex.Matches(input, backslash);
            if (matches.Count > 0)
                Console.WriteLine("双引号没有被正确转义");
            else
                Console.WriteLine("双引号都有正确转义");
            #endregion

            #region test
            Console.WriteLine(lambdaParser.Eval("Now.ToString(\"yyyy-MM-dd/HH\")", dictLast));
            Console.WriteLine(lambdaParser.Eval("Max(Max(3,4),2)", dictLast));
            Console.WriteLine(lambdaParser.Eval("arr[0]+arr[1]", dictLast)); // -> 4
            Console.WriteLine(lambdaParser.Eval("dic[\"apple\"]+arr[1]", dictLast)); // -> 3.5
            Console.WriteLine(lambdaParser.Eval("(new[]{1,2})[1]", dictLast)); // 2
            #endregion
            int i = 0;
            foreach (var v in this.Variables.Text.Trim().Split(','))
            {
                if (i == 0)
                    tagsql = this.DataSet1.Text.Trim();
                else
                    tagsql = this.DataSet2.Text.Trim();
                var rtTagInfos = await _dbInstance.DBOperation.QueryAsync<dynamic>(tagsql);
                if (rtTagInfos.Count() == 1)
                {
                    var dictSingle = ((IDictionary<string, object>)rtTagInfos.FirstOrDefault())
                        .ToDictionary(kvp => kvp.Key.Split(new[] { '(', ')' }).LastOrDefault(), kvp => kvp.Value);
                    dictLast = dictLast.Union(dictSingle).ToDictionary(x => x.Key, x => x.Value);
                }
                else
                {
                    #region 没有去重
                    //var keyValuePairs = new List<KeyValuePair<string, object>>();
                    //foreach (var record in rtTagInfos)
                    //{
                    //    int i = 0;
                    //    string propertyName = string.Empty;
                    //    foreach (var property in (IDictionary<string, object>)record)
                    //    {
                    //        if (i == 0)
                    //            propertyName = Convert.ToString(property.Value);
                    //        else
                    //            keyValuePairs.Add(new KeyValuePair<string, object>(propertyName, property.Value));
                    //        i = i + 1;
                    //    }
                    //}
                    //var dictlist = keyValuePairs.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
                    #endregion
                    var keyValuePairs = new HashSet<KeyValuePair<string, object>>();
                    Parallel.ForEach(rtTagInfos, (record) =>
                    {
                        int i = 0;
                        string propertyName = string.Empty;
                        foreach (var property in (IDictionary<string, object>)record)
                        {
                            if (i == 0)
                            {
                                propertyName = Convert.ToString(property.Value);
                            }
                            else
                            {
                                var keyValuePair = new KeyValuePair<string, object>(propertyName, property.Value);
                                lock (keyValuePairs)
                                {
                                    if (!keyValuePairs.Contains(keyValuePair))
                                    {
                                        if (!keyValuePairs.Any(kvp => kvp.Key == keyValuePair.Key))
                                        {
                                            keyValuePairs.Add(keyValuePair);
                                        }
                                    }
                                }
                            }
                            i = i + 1;
                        }
                    });
                    var dictlist = keyValuePairs.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
                    dictLast = dictLast.Union(dictlist).ToDictionary(x => x.Key, x => x.Value);
                }
                i = i + 1;
            }
            var res = lambdaParser.Eval(this.Rule.Text.Trim().Replace("$", ""), dictLast);
            MessageBox.Show(res?.ToString());
        }

        public string AlertAsync(string msg)
        {
            var time = "SELECT NOW() as now";
            var rtTagInfos = AsyncHelper.RunSync(() => _dbInstance.DBOperation.QueryFirstOrDefaultAsync<DateTime>(time));
            return msg + rtTagInfos.ToString();
        }

reportvalue<1234?"1":Alert("告警:")

相关推荐
侃侃_天下2 小时前
最终的信号类
开发语言·c++·算法
echoarts2 小时前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Aomnitrix2 小时前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
大飞pkz2 小时前
【设计模式】C#反射实现抽象工厂模式
设计模式·c#·抽象工厂模式·c#反射·c#反射实现抽象工厂模式
每天回答3个问题3 小时前
UE5C++编译遇到MSB3073
开发语言·c++·ue5
伍哥的传说3 小时前
Vite Plugin PWA – 零配置构建现代渐进式Web应用
开发语言·前端·javascript·web app·pwa·service worker·workbox
小莞尔4 小时前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
我是菜鸟0713号4 小时前
Qt 中 OPC UA 通讯实战
开发语言·qt
JCBP_4 小时前
QT(4)
开发语言·汇编·c++·qt·算法
Brookty4 小时前
【JavaEE】线程安全-内存可见性、指令全排序
java·开发语言·后端·java-ee·线程安全·内存可见性·指令重排序