2016-09-27 27 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