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("告警:")

相关推荐
gCode Teacher 格码致知1 小时前
Pandas教学-17:Series与Dataframe的关系
开发语言·python·pandas
发量惊人的中年网工2 小时前
分公司访问总部ERP慢怎么办?SD-WAN组网的排查与验收要点
服务器·开发语言·php
下页、再停留2 小时前
【C#桌面客户端系列学习-15】生成可视化图表之折线图、柱状图、饼状图
开发语言·c#
ShineWinsu2 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
益莱储中国4 小时前
深度解析:RF 实验室从 5G迈向 6G 的过程中保持技术领先与设备升级的路径
开发语言·php
Vex2une4 小时前
Docker Desktop WSL2后端:2026年性能调优与避坑实战指南
windows·docker·desktop·gpu容器·容器开发·virtiofs·buildkit
benchmark_cc4 小时前
Python 量化系统如何设计统一的数据访问接口:从策略解耦到数据层架构
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
const_qiu5 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
Wang's Blog5 小时前
Java 项目实战: 交友项目 - 个人资料管理的更新接口实现与坑
java·开发语言·交友
CoderYanger5 小时前
Java EE 进阶:4.Spring Web MVC 入门(第一弹)
java·开发语言·前端·spring·面试·java-ee·mvc