我有一個List<String>
,它充滿了值和運算符。評估列表<String>作爲一個數學表達式
["123", "+", "(", "890", "-", "15.00", ")"]
我知道我可以做一個算法,將推動這些數字和運算符入棧和彈出他們關閉和評估,我去。但是,如果不使用外部庫,有沒有更好的方法?
我有一個List<String>
,它充滿了值和運算符。評估列表<String>作爲一個數學表達式
["123", "+", "(", "890", "-", "15.00", ")"]
我知道我可以做一個算法,將推動這些數字和運算符入棧和彈出他們關閉和評估,我去。但是,如果不使用外部庫,有沒有更好的方法?
推數字和運算入棧將是一個解釋。
明顯的更好的方法來做到這一點(對於「更好」的一些定義)是編寫一個編譯器!
您已經將輸入拆分爲詞法標記,因此您可以跳過實施詞法分析器並可以直接轉入構建AST。您可以找到合適的課程將您的輸入變爲System.Linq.Expressions Namespace;看看Expression Class。您可以將結果封裝在一個lambda表達式中,將其編譯爲IL並在CLR上執行它!
使用編譯器來評估常量似乎毫無意義,但如果他有變量,那麼這將是一個好主意。 – Gabe
您可以加入List
,然後讓編譯器在Mehrdad聲明的運行時對其進行評估。
Expression e = new Expression("5 * 2");
e.Evaluate();
我發現了一個非常類似的問題已經問here
更新:
NCalc「NCalc - 數學公式計算器爲.NET」即使這是一個外部庫,我認爲它是一個開放這意味着您可以直接將代碼添加到您的項目中。
更新:
可以使用String.Join
功能的加入列表。
string formula = String.Join("",listMathOperators);
你能提供一個指向你的代碼中使用的Expression類的鏈接嗎? – dtb
+1,相關問題 –
我有一個完整的類來計算任何表達式。
首先,您需要在列表中的所有字符串提取到一個字符串,如:
string sExpression = "123+(890-15.00)";
其次,你需要在一個解析器來評估這個表達式,我有一個完整的類,使得本作你,但我不能在這裏添加文件。
這些是從用戶輸入分解還是由其他系統提供給您的? – user7116
你是否試圖在沒有使用現有庫或編寫自己的實現?或者你正在尋找一個包含在標準庫中的庫嗎? – corsiKa
我正在尋找包含在標準庫中的東西,或者我會寫我自己的算法。 –