2016-09-27 8 views
0

変数に操作+, -, *, /, %, ^を実行する必要があるプロジェクトのような電卓を作成しています。標準操作のタイプはvar1 OP var2です。私は実行時に両方の変数の型を持っています。これはInt64またはdoubleです。実行時に変数をintに変換して操作する

私はそれらを両方とも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

コンテナの時刻タイプはどのようなものですか? – Vikhram

+0

これはオブジェクトです – Crimson7

+0

あなたは何か不必要な冗長性を持っていますか?また、container1.valueとcontainer2.valueにはどのようなことがありますか?彼らは文字列ですか? int64?ダブル? Convert.ToDoubleは、文字列をdoubleに変換するために使用されます。一方(Int64)はキャストしているだけです。値が文字列の場合は、変換を使用する必要があります。しかし、値が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

静的型を使用するよりも高価です。どのくらいは状況によりますか。詳細は[this post](http://stackoverflow.com/a/7480977/5671993)をチェックしてください – Vikhram

関連する問題