2011-08-16 80 views
0

我有一個List<String>,它充滿了值和運算符。評估列表<String>作爲一個數學表達式

["123", "+", "(", "890", "-", "15.00", ")"] 

我知道我可以做一個算法,將推動這些數字和運算符入棧和彈出他們關閉和評估,我去。但是,如果不使用外部庫,有沒有更好的方法?

+0

這些是從用戶輸入分解還是由其他系統提供給您的? – user7116

+0

你是否試圖在沒有使用現有庫或編寫自己的實現?或者你正在尋找一個包含在標準庫中的庫嗎? – corsiKa

+0

我正在尋找包含在標準庫中的東西,或者我會寫我自己的算法。 –

回答

4

推數字和運算入棧將是一個解釋。

明顯的更好的方法來做到這一點(對於「更好」的一些定義)是編寫一個編譯器!

您已經將輸入拆分爲詞法標記,因此您可以跳過實施詞法分析器並可以直接轉入構建AST。您可以找到合適的課程將您的輸入變爲System.​Linq.​Expressions Namespace;看看Expression Class。您可以將結果封裝在一個lambda表達式中,將其編譯爲IL並在CLR上執行它!

+0

使用編譯器來評估常量似乎毫無意義,但如果他有變量,那麼這將是一個好主意。 – Gabe

0

您可以隨時使用C#編譯器類在.NET框架,它評估爲C#表達...

+0

你有這樣的鏈接或例子嗎? –

+4

您需要先驗證字符串,否則可能會執行的操作比您期望的要多得多。 – wsanville

+0

你的意思是CodeDOM或表達式樹? – Gabe

2

您可以加入List,然後讓編譯器在Mehrdad聲明的運行時對其進行評估。

Expression e = new Expression("5 * 2"); 
e.Evaluate(); 

我發現了一個非常類似的問題已經問here

更新:

NCalc「NCalc - 數學公式計算器爲.NET」即使這是一個外部庫,我認爲它是一個開放這意味着您可以直接將代碼添加到您的項目中。

更新:

可以使用String.Join功能的加入列表。

string formula = String.Join("",listMathOperators); 
+0

你能提供一個指向你的代碼中使用的Expression類的鏈接嗎? – dtb

+0

+1,相關問題 –

0

我有一個完整的類來計算任何表達式。

首先,您需要在列表中的所有字符串提取到一個字符串,如:

string sExpression = "123+(890-15.00)"; 

其次,你需要在一個解析器來評估這個表達式,我有一個完整的類,使得本作你,但我不能在這裏添加文件。