c# - switch - if else




Alternative zum Schreiben vieler if-Anweisungen? (4)

Gibt es eine Möglichkeit, stattdessen eine switch Anweisung zu schreiben?

switch (something)
{
  case "degrees" : do work
  ...etc
}

Hier ist meine Methode:

private void ConvertValues()  
{  
    txtResult.Text = angles[cmbUnits1.SelectedIndex];  
    double value1 = Convert.ToDouble(txtValue1.Text);  
    double value2 = Convert.ToDouble(txtValue2.Text);  
    int unit1 = cmbUnits1.SelectedIndex;  
}

Ich möchte, dass die Methode die ComboBoxes auswählt und die Werte testet. Aber ich möchte wissen, ob es eine Alternative dazu gibt:

if( angles[cmbUnits1.SelectedIndex].Equals("Degrees") && 
    angles[cmbUnits2.SelectedIndex].Equals("Radians")) {  
    ...  
}

Übrigens mache ich eine Art Einheitskonverter, also werde ich andere Abschnitte als Winkel haben. Also ich möchte etwas enum, Schnittstelle, abstrakte Klasse oder Klasse, die ich implementieren kann. Vielleicht eine Klasse mit dem Namen Unit? So kann ich neue Objekte wie Unit degrees = new Unit(Units.Angle) mit Einheiten als Enum Unit degrees = new Unit(Units.Angle) . Oder nur Unit sqrMillimeters = new Unit("Area"); ?


Sie könnten beide Strings verketten ("DegreesRadians") und über Reflection eine Methode namens "DegreesRadians" aufrufen:

MethodInfo theMethod = thisType.GetMethod(methodName);
theMethod.Invoke(this, parameters);

Wobei methodName die verketteten Strings sind (möglicherweise mit zusätzlichen Informationen, wie "convert" + unit1 + "2" + unit2, wie "convertDegrees2Radians"), und parameters ist ein Array, das beide Werte enthält.


double UnitToFactor(string unit) { returns 1 for radians, pi/180 for degrees, etc }

dann

ratio = UnitToFactor(unit1) / UnitToFactor(unit2);

und dest = src*ratio

Auf diese Weise haben Sie anstelle von N ^ 2 if () -Anweisungen nur N.


Sicher, Polymorphismus. Immer wenn du lange switch-Anweisungen siehst oder wenn / then / else konstruiert, ist es immer möglich, sie mit Polymorphismus und Fabriken zu behandeln. In Ihrem Fall würde ich mir eine ITemperatureConverter-Schnittstelle mit konkreten Implementierungen für Fahrenheit, Celcius, Kelvin und Rankine vorstellen.

AKTUALISIEREN:

Wenn Sie feststellen, dass Sie diese Logik wiederholt haben, warum haben Sie nicht eine bessere Abstraktion für einen Winkel als ein Doppel?

Wenn Sie in einer objektorientierten Sprache schreiben, ist es eine gute Idee, über Grundelemente (z. B. double und yes, string) hinauszugehen, um das Verhalten in Objekte einzubetten.

Ich würde über eine Angle-Klasse nachdenken, die an dem Wert hängen und ihn wie gewünscht zurückgeben würde.

Hier ist eine Möglichkeit, dies in Java zu tun. Ich überlasse die Übersetzung C # und den Rest für Sie.

package angles;

public class Angle
{
    private double value;
    private AngleUnit units;

    public Angle()
    {
        this(0.0, AngleUnit.RADIANS);
    }

    public Angle(double value)
    {
        this(value, AngleUnit.RADIANS);
    }

    public Angle(double value, AngleUnit units)
    {
        this.value = value;
        this.units = units;
    }

    public double getValue()
    {
        return value;
    }

    public AngleUnit getUnits()
    {
        return units;
    }

    public Angle convert(AngleUnit newUnits)
    {
        Angle newAngle = null;

        if (this.units.equals(newUnits))
        {
            return this;
        }

        return newAngle;
    }
}

package angles;

public interface AngleConverter
{
    Angle convert(Angle angle, AngleUnit to);
}

package angles;

public enum AngleUnit
{
    DEGREES, RADIANS, GRADIANS;
}

package angles;

import java.util.HashMap;
import java.util.Map;

public class DegreeConverter implements AngleConverter
{
    private final Map<AngleUnit, Double> factors;

    public DegreeConverter(Map<AngleUnit, Double> factors)
    {
        this.factors = new HashMap<AngleUnit, Double>();
        this.factors.put(AngleUnit.DEGREES, 1.0);
        this.factors.put(AngleUnit.RADIANS, Math.PI/180.0);
        this.factors.put(AngleUnit.GRADIANS, 100.0/90.);
    }

    public Angle convert(Angle angle, AngleUnit to)
    {
        assert angle != null && to != null;

        return new Angle(angle.getValue()*this.factors.get(to), to);
    }
}




combobox