C# 规则引擎
根据不同的城市以及购买数量,加载json文件,得到优化折扣,运行结果:
DisCount.json
[ { "WorkflowName": "Discount", "Rules": [ { "RuleName": "rule1", "SuccessEvent": "9", "ErrorMessage": "One or more adjust rules failed.", "ErrorType": "Error", "RuleExpressionType": "LambdaExpression", "Expression": "input1.city == \"厦门\" AND input2.totalOrders >=0" }, { "RuleName": "rule2", "SuccessEvent": "8", "ErrorMessage": "One or more adjust rules failed.", "ErrorType": "Error", "RuleExpressionType": "LambdaExpression", "Expression": "input1.city == \"泉州\" AND input2.totalOrders >=1" } ] } ]
using Newtonsoft.Json; using Newtonsoft.Json.Converters; using RulesEngine.Extensions; using RulesEngine.Models; using System; using System.Collections.Generic; using System.Dynamic; using System.IO; using System.Windows.Forms; namespace RulesEngineDemo { public partial class MainForm : Form { // NuGet -> RulesEngine public MainForm() { InitializeComponent(); cmbCity.SelectedIndex = 0; } private void btnSubmit_Click(object sender, EventArgs e) { string city = cmbCity.Text; string count = txtCount.Text.Trim(); var basicInfo = "{\"city\": \"" + city +"\"}"; var orderInfo = "{\"totalOrders\": " + count + "}"; var converter = new ExpandoObjectConverter(); dynamic input1 = JsonConvert.DeserializeObject<ExpandoObject>(basicInfo, converter); dynamic input2 = JsonConvert.DeserializeObject<ExpandoObject>(orderInfo, converter); var inputs = new dynamic[] { input1, input2 }; // 加载规则 var files = Directory.GetFiles(Directory.GetCurrentDirectory(), "Discount.json", SearchOption.AllDirectories); if (files == null || files.Length == 0) { lblMsg.Text = "Rules not found."; return; } var fileData = File.ReadAllText(files[0]); var workflowRules = JsonConvert.DeserializeObject<List<WorkflowRules>>(fileData); // 初始化规则引擎 var bre = new RulesEngine.RulesEngine(workflowRules.ToArray(), null); string note = "没有折扣"; // 执行规则 List<RuleResultTree> resultList = bre.ExecuteAllRulesAsync("Discount", inputs).Result; // 处理结果 resultList.OnSuccess((eventName) => { note = $"打 {eventName} 折"; }); resultList.OnFail(() => { note = "不打折"; }); lblMsg.Text = note; } } }
qq:505645074
分类:
小码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2020-06-29 1. 云停车 (开篇)