2016-09-27 36 views
0

我正在創建一個像項目這樣的計算器,它需要對變量執行操作+, -, *, /, %, ^。標準操作類型爲var1 OP var2。我在運行時有兩個變量類型,它們可以是Int64double轉換(int爲double)並在運行時對變量進行操作

我可以將它們都轉換爲double並執行計算,但是我更願意在兩個變量都是整數時進行基於整數的計算(否則將兩者都轉換爲double)。這是我迄今爲止得到(加法)


if (container1.vType == Interop.variableType.DOUBLE || container2.vType == Interop.variableType.DOUBLE) 
    return Convert.ToDouble(container1.value) + Convert.ToDouble(container2.value); 
return (Int64)container1.value + (Int64)container2.value; 

然而,由於多個操作,使用相同/相似的代碼一遍又一遍地將產生不必要的冗餘(我只是必須改變運營商)。

那麼,我該如何做到這一點,以便它具有高性能和最小/無冗餘?

+0

什麼是container1.values和container2.values的編譯時類型? – Vikhram

+0

他們是對象 – Crimson7

+0

你有什麼不必要的冗餘?另外,你期望在container1.value和container2.value中有什麼?他們是絃樂? Int64的?雙? Convert.ToDouble用於將字符串轉換爲double。 (Int64)只是在投射。如果你的值是字符串,那麼你可能需要使用Convert。但是,如果值是int或double,那麼你可以投它。 – kurakura88

回答

2

這是另一種方式。它減少了代碼重複,但增加了LOC。這肯定比直接調用操作員效率低。這樣做的主要好處是長期維護的可擴展性和模塊化。

class Evaluator { 
    Dictionary<string, Func<dynamic, dynamic, dynamic>> BinaryOperatorsDyn = new Dictionary<string, Func<dynamic, dynamic, dynamic>>(); 

    public Evaluator() { 
     LoadOperators(); 
    } 

    void LoadOperators() { 
     BinaryOperatorsDyn.Add("+", (x, y) => x + y); 
     BinaryOperatorsDyn.Add("-", (x, y) => x - y); 
     BinaryOperatorsDyn.Add("*", (x, y) => x * y); 
    } 

    public void DoDemo() { 
     long x = 20; 
     double y = 30; 
     var oper = "+"; 

     var result = BinaryOperatorsDyn[oper](x, y); 
     Console.WriteLine($"Result of {x} + {y} is {result}. Type of result is {result.GetType().ToString()}"); 
    } 
} 
class Program { 
    static void Main(string[] args) { 
     var eval = new Evaluator(); 
     eval.DoDemo(); 
    } 
} 
+0

我喜歡這個解決方案,但是使用起來動態不是很昂貴? – Crimson7

+0

它們比使用靜態類型更昂貴。還有多少要看情況。查看[這篇文章](http://stackoverflow.com/a/7480977/5671993)瞭解詳情 – Vikhram