繁体   English   中英

如何缩短以下C#if语句?

[英]How can I shorten the following C# if statements?

我想缩短以下代码,但我不知道从哪里开始。

交换机是否可以采用这种方式?

        static string RevisedConversionFunction(string input, string from, string to)
    {
        double exchangeRateUSD;
        double exchangeRateAUD;
        double exchangeRateCAD;
        double exchangeRateEUR;
        double exchangeRateGBP;
        double exchangeRateNZD;
        double fromExchangeRate;
        double toExchangeRate;
        exchangeRateUSD = 1;
        exchangeRateAUD = 1.31;
        exchangeRateCAD = 1.28;
        exchangeRateEUR = 0.95;
        exchangeRateGBP = 0.68;
        exchangeRateNZD = 1.36;
        fromExchangeRate = 0;
        toExchangeRate = 0;

        if (from.Equals("USD"))
        {
            fromExchangeRate = exchangeRateUSD;
        }
        if (from.Equals("AUD"))
        {
            fromExchangeRate = exchangeRateAUD;
        }
        if (from.Equals("CAD"))
        {
            fromExchangeRate = exchangeRateCAD;
        }
        if (from.Equals("EUR"))
        {
            fromExchangeRate = exchangeRateEUR;
        }
        if (from.Equals("GBP"))
        {
            fromExchangeRate = exchangeRateGBP;
        }
        if (from.Equals("NZD"))
        {
            fromExchangeRate = exchangeRateNZD;
        }

        if (to.Equals("USD"))
        {
            toExchangeRate = exchangeRateUSD;
        }
        if (to.Equals("AUD"))
        {
            toExchangeRate = exchangeRateAUD;
        }
        if (to.Equals("CAD"))
        {
            toExchangeRate = exchangeRateCAD;
        }
        if (to.Equals("EUR"))
        {
            toExchangeRate = exchangeRateEUR;
        }
        if (to.Equals("GBP"))
        {
            toExchangeRate = exchangeRateGBP;
        }
        if (to.Equals("NZD"))
        {
            toExchangeRate = exchangeRateNZD;
        }

        double amount;
        Double.TryParse(input, out amount);

        amount = (amount / fromExchangeRate) * toExchangeRate;
        amount = Math.Round(amount, 2);

        string result = Convert.ToString(amount);
        return result;
    }

我不熟悉交换机,但有没有办法可以在这种情况下使用它们?

先谢谢,马特

编辑 - 编辑 - 编辑 - 编辑 - 编辑

谢谢大家的意见。

以下代码是我最终使用的代码:

        static string RevisedConversionFunction(string input, string from, string to)
    {

        //Exchange Rates
        Dictionary<string, double> rates = new Dictionary<string, double>();
        rates.Add("USD", 1);
        rates.Add("AUD", 1.31);
        rates.Add("CAD", 1.28);
        rates.Add("EUR", 0.95);
        rates.Add("GBP", 0.68);
        rates.Add("NZD", 1.36);

        //Conversion
        double amount;
        Double.TryParse(input, out amount);
        return Convert.ToString(Math.Round(((amount / rates[from]) * rates[to]), 2));
    }
  • 在这种情况下我会使用字典
  • 使用decimal而不是double来防止舍入问题

码:

static string RevisedConversionFunction(string input, string from, string to)
{
    Dictionary<string, decimal> dExchange = new Dictionary<string, decimal>()
    { 
        {"USD" , 1},
        {"AUD" , 1.31m},
        {"CAD" , 1.28m},
        {"EUR" , 0.95m},
        {"GBP" , 0.68m},
        {"NZD" , 1.36m}
    };

    if (dExchange.ContainsKey(from) && dExchange.ContainsKey(to))
    {
        return Math.Round((decimal.Parse(input) / dExchange[from]) * dExchange[to], 2).ToString();
    }
    else
    {
        // at least one currency not in the dictionary - exception handling?
        return null; 
    }
}

我不是ac#user但我认为使用数组更好

var dictionary = new Dictionary<string, string>
{
    { "USD", "exchangeRateUSD" },
    { "AUD", "exchangeRateAUD" },
    { "CAD", "exchangeRateCAD" }
};

如果您打算使用if语句,那么您也应该使用if语句。 你在那里的代码将检查每一个,即使第一个命中。 这只会检查第一个(假设第一个为真)。

if (from.Equals("USD"))
    {
        fromExchangeRate = exchangeRateUSD;
    }
else if (from.Equals("AUD"))
    {
        fromExchangeRate = exchangeRateAUD;
    }

将其切换到交换机可能是一个很好的解决方案:

switch(a) { case 0: ...; break; case 1: ...; break; }

通常任何遇到if..else if ..序列的现代编译器都可以由一个人转换成switch语句,编译器也是如此。

创建映射字典,如下所示:

public static readonly Dictionary<string, double> currencyMapping = 
    new Dictionary<string, double>
    {
      {"USD",1},
      {"AUD",1.31},
      {"CAD",1.28},
      {"EUR",0.95},
      {"GBP",0.68},
      {"NZD",1.36},   
    }

现在可以按如下方式使用, TryGet值或分配默认值。 另请注意, Dictionary包含只读信息,它只是一个static readonly ,在构造函数中进行一次运行时评估,然后它无法在程序中的任何地方进行修改,因此是一个非常恒定的信息,如const,即编译时

 double fromExchangeRate;
    if(!currencyMapping.TryGetValue(from,out fromExchangeRate))
      fromExchangeRate = <DefaultValue>

你可以使用字典。

var exchanges = new Dictionary<string, double>()
{
    ["USD"] = 1,
    ["AUD"] = 1.31,
    ["CAD"] = 1.28,
    ["EUR"] = 0.95,
    ["GBP"] = 0.68,
    ["NZD"] = 1.36,
};

double fromExchangeRate = 0;
double toExchangeRate = 0;

if (exchanges.ContainsKey(from))
{
    fromExchangeRate = exchanges[from];
}
else
{
    // 'from' not in dictionary
}


if (exchanges.ContainsKey(to))
{
    toExchangeRate = exchanges[to];
}
else
{
    // 'to' not in dictionary
}

使用数组减少第一行代码数组总是固定大小,必须这样定义:

double[] exchangeRate = new double[8];

// This means array is double[3] and cannot be changed without redefining it.
exchangeRate[0] = 1;
exchangeRate[1] = 1.31;
and so on..

而对于String Data,将它存储在Array中

String[] Data = new String[8];

// This means array is double[3] and cannot be changed without redefining it.
Data[0] = "USD";
Data[1] = "AUD";
and so on..

然后使用Foreach遍历

foreach (String[] row in Data)
{
    if(from.Equals(Data[0]))
    {
       //Do something
    }
}

按照您的要求,您也可以这样做。

希望它对你有用..谢谢:-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM