C#货币转换器:减少if语句的数量

时间:2017-06-29 06:04:11

标签: c# performance if-statement

到目前为止,我已经创建了一个货币转换器,它将在多种不同的货币之间进行转换,但为了转换货币,我已经使用了4种if货币(因此我可以在所有不同货币之间进行转换。)这导致了20如果陈述看起来不是很干净或有效。以下是我的代码示例:

if (currencyFrom == "B" && currencyTo == "U")
{
    currencyConversion = doubleInput * 1.29;
    Console.WriteLine("$" + currencyConversion);
}
if (currencyFrom == "B" && currencyTo == "E")
{
    currencyConversion = doubleInput * 1.14;
    Console.WriteLine("€" + currencyConversion);
}
if (currencyFrom == "B" && currencyTo == "J")
{
    currencyConversion = doubleInput * 145.10;
    Console.WriteLine("¥‎" + currencyConversion);
}
if (currencyFrom == "B" && currencyTo == "C")
{
    currencyConversion = doubleInput * 1.68;
    Console.WriteLine("$‎" + currencyConversion);
}

有没有更好的方法来进行相同的计算,但没有多少if语句?

感谢您的帮助,

约什

4 个答案:

答案 0 :(得分:4)

如果你真的想减少if-statements的数量并且你的要求允许使用互联网资源我有一个非常短的代码样本,使用 Yahoo Finance

public decimal ConvertCurrency(string from, string to)
{
    var uriString = string.Format("http://finance.yahoo.com/d/quotes.csv?s={0}{1}=X&f=l1", from, to);
    string response = new WebClient().DownloadString(uriString);
    return decimal.Parse(response, System.Globalization.CultureInfo.InvariantCulture);
}

async方式:

public async Task<decimal> ConvertCurrencyAsync(string from, string to)
{
    var uriString = string.Format("http://finance.yahoo.com/d/quotes.csv?s={0}{1}=X&f=l1", from, to);
    string response = await new WebClient().DownloadStringTaskAsync(uriString);
    return decimal.Parse(response, System.Globalization.CultureInfo.InvariantCulture);
}

使用该代码,您可以从任何货币转换为货币,并且您拥有当前的汇率。

答案 1 :(得分:3)

您可以使用Dictionary

decimal currencyConversion;
        string currencyFrom = "B";
        string currencyTo = "E";
        decimal doubleInput = 1000m;

    Dictionary<string, decimal> dic = new Dictionary<string, decimal>();
    dic.Add("BU", 1.29m);
    dic.Add("BE", 1.14m);
    dic.Add("BJ", 145.10m);
    dic.Add("BC", 1.68m);

    currencyConversion = doubleInput * dic[currencyFrom + currencyTo];

答案 2 :(得分:1)

这样的事情应该有效。

if (currencyFrom == "B") {
    switch (currencyTo) {
        case "U":
            currencyConversion = doubleInput * 1.29;
            break;
        case "E":
            ...
    }
}

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/switch

正如其他人所指出的那样,使用这样的条件逻辑并不能实现非常可扩展的应用程序。与使用多个if相比,Switch更整洁,更简单,但肯定会有更有效的方法来重新设计应用程序,使其更好地扩展。

答案 3 :(得分:1)

您可以使用字典存储转换比率,然后使用更清晰的函数来进行计算。

首先声明一个ConcurrentDictionary(这样你甚至可以安全地更新飞行线程上的比率)。

private readonly static ConcurrentDictionary<Tuple<string, string>, double> ConversionRatios = new ConcurrentDictionary<Tuple<string, string>, double>();

您需要使用from和to货币对及其各自的比率填充ConversionRatios。

static MyClass()
{
    ConversionRatios.TryAdd(new Tuple<string, string>("B", "U"), 1.29);
    ConversionRatios.TryAdd(new Tuple<string, string>("B", "E"), 1.14);
    ConversionRatios.TryAdd(new Tuple<string, string>("B", "J"), 145.10);
    ConversionRatios.TryAdd(new Tuple<string, string>("B", "C"), 1.68);
}

然后你可以有一个非常简单的转换函数。

private static double Convert(double doubleInput, string currencyFrom, string currencyTo)
{
    double ratio;
    if (ConversionRatios.TryGetValue(new Tuple<string, string>(currencyFrom, currencyTo), out ratio))
    {
        return doubleInput * ratio;
    }

    // Handle case when no ratio is found, either throw exception or do what ever.
    throw new Exception("No ratio found.");
}