2016-09-27 3 views
0

Ich bin ein Rechner wie Projekt erstellen, die Operationen +, -, *, /, %, ^ auf Variablen erfordert. Standardoperationen sind vom Typ var1 OP var2. Ich habe den Typ der beiden Variablen zur Laufzeit, die entweder Int64 oder double sein können.Converting (int zu double) und Betrieb auf Variablen zur Laufzeit

Ich kann beide konvertieren, um zu verdoppeln und Berechnungen durchzuführen, aber ich würde lieber integer-based Berechnungen machen, wenn beide Variablen Integer sind (andernfalls beide in Doppel konvertieren). Dies ist, was ich bisher bekam (für Zusatz)


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; 

jedoch aufgrund mehrerer Operationen gleichen/ähnlichen Code über Verwendung und über unnötige Redundanz schaffen wird (Ich werde einfach haben den Bediener ändern).

Also wie soll ich das tun, damit es sowohl hohe Leistung als auch minimale/keine Redundanz hat?

+0

Was ist der Kompilierzeittyp von container1.values ​​und container2.values? – Vikhram

+0

sie sind Objekte – Crimson7

+0

welche unnötige Redundanz haben Sie? Was erwarten Sie auch in container1.value und container2.value? Sind sie Schnur? int64? doppelt? Convert.ToDouble wird verwendet, um die Zeichenfolge in Double umzuwandeln. Während (Int64) nur Casting ist. Wenn Ihr Wert eine Zeichenfolge ist, müssen Sie möglicherweise Konvertieren verwenden. Wenn der Wert jedoch entweder int oder double ist, können Sie ihn einfach umsetzen. – kurakura88

Antwort

2

Dies ist eine andere Art, es zu tun. Es reduziert Ihre Code-Duplizierung, erhöht aber die LOC. Es ist sicherlich weniger effizient, als den Operator direkt aufzurufen. Der Hauptvorteil dieser Art ist Skalierbarkeit und Modularität für die langfristige Wartung.

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

Ich mag die Lösung, aber sind Dynamik nicht sehr teuer zu verwenden? – Crimson7

+0

Sie sind teurer als die Verwendung statischer Typen. Wie viel mehr hängt von der Situation ab. Überprüfen Sie [diesen Beitrag] (http://stackoverflow.com/a/7480977/5671993) für Details – Vikhram

Verwandte Themen