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

相关推荐
John_ToDebug2 小时前
浏览器扩展延迟加载优化实战:如何让浏览器启动速度提升50%
c++·chrome·windows
是娇娇公主~2 小时前
C++ 中 std::deque 的原理?它内部是如何实现的?
开发语言·c++·stl
SuperEugene3 小时前
Axios 接口请求规范实战:请求参数 / 响应处理 / 异常兜底,避坑中后台 API 调用混乱|API 与异步请求规范篇
开发语言·前端·javascript·vue.js·前端框架·axios
蟑螂恶霸3 小时前
Windows安装OpenCV 4.8
人工智能·windows·opencv
xuxie994 小时前
N11 ARM-irq
java·开发语言
唐青枫4 小时前
C#.NET ReaderWriterLockSlim 深入解析:读写锁原理、升级锁与使用边界
c#·.net
wefly20174 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
luanma1509805 小时前
PHP vs C++:编程语言终极对决
开发语言·c++·php
寂静or沉默5 小时前
2026最新Java岗位从P5-P7的成长面试进阶资源分享!
java·开发语言·面试
特立独行的猫a5 小时前
在 Windows 10 上安装和使用 WSL 2 安装 Ubuntu24详细指南
windows·ubuntu·wsl2