表達式的動態解析和計算,Flee用起來真香

前言

在很多項目中經常會出現需要動態解析表達式和計算的場景,比如一些自動審核規則,或者是一些變量的值通過維護的公式在運行過程中動態算出;由于場景需求,都需要比較靈活的配置對應的表達式,然后希望在需要的時候能根據維護的表達式計算出對應的值;剛好這塊和同事聊天的時候說到Flee,感覺挺好用,趕緊來和小伙伴們來分享一波。

正文

1. Flee簡介

Flee是一個用于. net框架的表達式解析器和求值器,可以在運行時計算字符串表達式的值(如:sqrt(a^2 + b^2),其中a、b是變量)。它的解析和計算速度是比較快和高效的。

Flee 支持Net6.0、Net5.0、Netstandard2.1、Netstandard2.0。

其他就不多嘮了,咱們直接上幾個實例感受一波,更多詳情小伙伴們可以去github上查閱:

github地址:https://github.com/mparlak/Flee

2. 案例演示

案例就通過控制臺演示了,安裝上Flee包即可。

c9c6d5e4feee7db148dbb61bb7a12c1c.png
2.1 超級簡單案例

代碼中有具體的注釋,這里就不再詳細說步驟了,截圖如下:

0c291e28d0ec318689877c06e54bee0e.png

這種簡單表達式內容都已經確定,全是可以計算的,沒有變量。

應用場景1:表達式固定,直接通過對應的值拼接計算的場景。

應用場景2:表達式不固定,但是公式維護時針對一些變量值用特殊字符標記,然后通過正則表達式的形式找到標記的變量,并替換為對應的業務字段值。

如:[a]+[b]+3.14,這種情況是可以通過正則表達式將中括號標記的變量找出來的,然后根據對應的中間變量的名字替換對應的值就可以計算了。

2.2 帶變量的表達式

代碼中有具體的注釋,這里就不再詳細說步驟了,截圖如下:

5a3986d05aa6e165c252152485aff729.png

這種帶變量的形式就相對比較靈活,可以任意配置,只需在計算的時候將對應的變量附上值即可。有小伙伴可能會有疑問,變量不確定咋整啊,其實在實際應用場景中,很多時候需要傳入的那些變量應該都知道,只是照著公式的規則動態傳值即可。

應用場景:和簡單案例中的不太一樣,不需要特殊標記變量,這里直接正常維護公式正常傳值即可。這種情況相對靈活,可以針對相關業務配置對應的公式,最后傳對應的變量進行計算,最后根據算出的值進行相關業務處理即可。

2.3 表達式組合

CalculationEngine 可以將表達式進行組合計算,計算引擎會使用引擎內部其他表達式的結果、依賴關系,然后按順序進行計算出組合之后的結果

6b4152914075ed0cef28f68d0dd7b935.png

應用場景:這種情況一般用于有多個表達式的場景,就類似于Excel中多個單元格中的表達式一樣,每個單元格中都有表達式,然后有一個單元格就會引用其他單元格中的表達式計算出來的值,最后得出結果。

2.4 擴展函數

有時候在項目中會將計算邏輯進行封裝,只需要傳入需要值即可,不需要每個調用者還得重新進行編寫相關的計算邏輯,Flee也支持在表達式中組合使用自定義的函數,演示如下:

先在一個類中寫好相關的方法,這里的方法一定要是靜態的、公共的,如下:

a797bb7f657482ad4b61835da489c167.png

然后就可以在表達式中用了,如下:

312758dd5285d1266c6b4e7f7a7548cf.png
2.5 支持可變參數的函數

和上面使用方式一樣,自定義一個方法,只是這個方法的參數是不確定,可變的,如下:

280b385c115c71d079b19ede68b936bb.png

在表達式中使用:

6df68e11ce86d7f37a863b66ade85e00.png
2.6 返回值是Boolean類型的表達式

在實際應用場景中,有些時候只需要得到一個是否的結果,可能不需要計算一個具體的值;

ea91fe4177b0f6364ca6690623691d44.png

應用場景:這種情況一般用于一些自動判定規則的需求,比如有一些報表的結果在不同的業務類型時會有一個值的范圍,如果超出范圍就代表不合規,靠人為判斷的話可能就沒那么高效;類似這種對比數據的情況,如果只是簡單的比對還容易實現,如果是復雜一點的關系比對,這種方式就相對靈活了。

好了,使用方式就暫時說到這,文中圖片已經包含所有的代碼。稍后我也會把代碼提交github上和碼云上。

總結

上文只是列舉了一些簡單的使用實例,具體小伙伴們可以根據業務場景進行使用。小伙伴們如果有更好的工具庫,歡迎大家留言,一起學習。

關注“Code綜藝圈”,和我一起學習吧。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285616.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285616.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285616.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言九十五之實現經典的反轉數組(通過指針或數組下標操作)

?作者簡介:大家好我是碼瑪莎拉蒂,CSDN博客專家🥇🥇🥇 📃個人主頁:個人主頁 🔥系列專欄:C語言試題200例 💬推薦一款模擬面試、刷題神器👉 點擊跳轉…

Linux下使用shell實現上傳linux下某個目錄下所有文件到ftp

首先我們需要搞清楚單個文件怎么上傳,把這個單文件上傳到ftp上的實現命名為一個:upload_to_ftp_command.sh 之后,需要弄清楚怎么實現遍歷一個目錄下的所有文件的,把這個遍歷某個目錄下的文件實現命名為:foeach_directory_and_uplo…

【地理信息系統GIS】教案(七章全)第二章:地理信息系統數據結構及數據獲取

文章目錄 第一節 地理空間及其表達第二節 空間數據采集第三節 屬性數據采集第四節 空間數據格式轉換第五節 空間數據質量第一節 地理空間及其表達 1.1 地理空間 地理空間上至大氣電離層,下至地幔莫霍面,是生命過程活躍的場所,也是宇宙過程對地球影響最大的區域。 地理信息…

[轉]Mysql數據庫開發的36條原則

前言 這些原則都是經歷過實戰總結而成 每一條原則背后都是血淋淋的教訓 這些原則主要是針對數據庫開發人員,在開發過程中務必注意 總是在災難發生后,才想起容災的重要性; 總是在吃過虧以后,才記得曾有人提醒過。 一、核心原則…

Kamp;R練習題6-1統計關鍵詞出現的次數

這道練習題訓練了: 1.結構體數組 2.二分查找 3.指針操作 ---- 都不難。但非常基礎,我認為非常好,做完了記到博客上來,題目見k&R,實現例如以下: /** Practice of struct array. K&R 6-1* author : w…

大話領域驅動設計——表示層及其他

概述表示層又稱用戶界面層,包含應用程序的頁面、組件等UI元素。服務層提供項目的HTTP API接口,包含MVC Controller和相關組件。ABP框架雖然在表示層提供了不少組件,但是這些和DDD本身沒有多少關系。而且隨著前后端分離架構的流行,…

C語言九十六之實現經典的字符串反轉(通過指針或下標操作)

?作者簡介:大家好我是碼莎拉蒂,CSDN博客專家🥇🥇🥇 📃個人主頁:個人主頁 🔥系列專欄:C語言試題200例 💬推薦一款模擬面試、刷題神器👉 點擊跳轉進…

Windows10家庭中文版沒有本地策略選項完美解決方案

Win+R,在運行中輸入:secpol.msc,查看安全設置是否打開,如下圖所示。 組策略對于優化和維護Windows系統來說十分重要。眾所周知,Windows 10家庭版中并不包含組策略,對于使用家庭版Windows的朋友來說,十分不方便。 通常情況下,如果策略組沒有打開的話,在安裝CAD等軟件時…

JavaScript總結(六)

使用DOM操縱樣式表 ? 操縱元素的Style樣式屬性(所有的均對于CSS的內聯式) 對于每個CSS樣式,Style對象都包含了一個相對應的屬性,只需要用到style屬性即可; Div.style.color "red"; //給div元素設置字體顏色…

[轉]淺談CMD和win powershell的區別

1、前言:本文給大家簡單描述了一下POWERSHELL和CMD的區別,簡單的說,Powershell是cmd的超集,換句話說,cmd能做的事情,Powershell都能做,但是Powershell還能額外做許多cmd不能做的活。 2、cmd是和…

【ArcGIS風暴】柵格計算器(Raster Calculator)運算出現錯誤問題及解決方案匯總

柵格計算器(Raster Calculator) 是一種空間分析函數工具,可以輸入地圖代數表達式,使用運算符和函數來做數學計算,建立選擇查詢,或鍵入地圖代數語法。只有熟練的運用并記憶一些常用的公式,才能很好的運用柵格計算器。在使用的過程中,容易出現這樣那樣的問題,本文就把柵…

「博客之星」評選,互投5星,留鏈必投

?? ? ?? 歡迎誠信互投? ? ? ?? ????? 謝謝各位大佬門,互投5星????? 投票地址: https://bbs.csdn.net/topics/603958492 投票地址: https://bbs.csdn.net/topics/603958492 投票地址: https://bbs.csdn.net…

為 ServiceCollection 實現裝飾器模式

為 ServiceCollection 實現裝飾器模式Intro在二十四種設計模式中,有一個模式叫做裝飾器模式一般用來動態地給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活,有更好的擴展性,我們也可以借助 D…

手把手教你啟用Win10的Linux子系統 Ubuntu

1、打開“開發者選項” 2、啟用“執行 Linux 程序的windows 子系統” 3、應用商店下載安裝Ubuntu 附:ubuntu的一些命令及查看已安裝軟件包的命令 // 系統 # uname -a # 查看內核/操作系統/CPU信息 # head -n 1 /etc/issue # 查看操作系統版本 # cat…

jquery的height()和javascript的height總結,js獲取屏幕高度

jquery的height()和javascript的height總結,js獲取屏幕高度在javascript和jquery中,都有對各種高度的寫法,在這里,我們就著重講一下窗口、文檔等高度的理解。(寬度和高度差不多!)jquery的各種高度首先來說一說$(docume…

【地理信息系統GIS】教案(七章全)第五章:空間數據查詢與空間分析

目錄 第一節 空間數據查詢第二節 緩沖區分析第三節 疊置分析第四節 網絡分析第五節 DEM建立及分析第一節 空間數據查詢 1.1 空間數據查詢 1、空間數據查詢的含義 從空間數據庫中找出所有滿足屬性約束條件和空間約束條件的地理對象。 空間數據查詢的一般過程 2、空間數據查詢…

Understanding G1 GC Logs--轉載

原文地址:https://blogs.oracle.com/poonam/entry/understanding_g1_gc_logs Understanding G1 GC Logs By Poonam-Oracle on Jun 18, 2012 The purpose of this post is to explain the meaning of GC logs generated with some tracing and diagnostic options fo…

Dart語言精簡入門介紹

Dart語言精簡入門介紹 1、介紹 Dart 在設計時應該是同時借鑒了 Java 和 JavaScript和kotlin 面向對象 JIT&AOT:JIT(Just in Time)優點:即時編譯,開發期間更快編譯,更快的重載;缺點&#…

WPF 窗口居中 變更觸發機制

本文經原作者授權以原創方式二次分享,歡迎轉載、分享。原文作者:唐宋元明清原文地址:https://www.cnblogs.com/kybs0/p/7420767.html窗口居中 & 變更觸發機制解決:1)單實例窗口,窗口每次隱藏后再顯示時…

[轉]5分鐘實現Android中更換頭像功能

5分鐘實現Android中更換頭像功能 寫在前面: 更換頭像這個功能在用戶界面幾乎是100%出現的。通過拍攝照片或者調用圖庫中的圖片,并且進行剪裁,來進行頭像的設置。 功能相關截圖如下: 下面我們直接看看完整吧: public cl…