Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#货币转换器:减少if语句的数量_C#_Performance_If Statement - Fatal编程技术网

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

C#货币转换器:减少if语句的数量,c#,performance,if-statement,C#,Performance,If Statement,到目前为止,我已经创建了一个货币转换器,可以在多种不同的货币之间转换。然而,为了转换货币,我使用了每种货币4个if语句(这样我可以在所有不同的货币之间转换)。这导致了20个if语句,看起来不是很干净或有效。下面是我的代码示例: if (currencyFrom == "B" && currencyTo == "U") { currencyConversion = doubleInput * 1.29; Console.WriteLine("$" + currenc

到目前为止,我已经创建了一个货币转换器,可以在多种不同的货币之间转换。然而,为了转换货币,我使用了每种货币4个if语句(这样我可以在所有不同的货币之间转换)。这导致了20个if语句,看起来不是很干净或有效。下面是我的代码示例:

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语句

谢谢你的帮助


乔希

像这样的事情应该行得通

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


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

类似的方法应该可以工作

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


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

您可以使用
字典

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];
十进制转换;
字符串currencyFrom=“B”;
字符串currencyTo=“E”;
十进制双输入=1000m;
Dictionary dic=新字典();
dic.添加(“BU”,1.29米);
dic.添加(“BE”,1.14米);
dic.添加(“BJ”,145.10m);
dic.添加(“BC”,1.68米);
currencyConversion=doubleInput*dic[currencyFrom+currencyTo];

您可以使用
字典

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];
十进制转换;
字符串currencyFrom=“B”;
字符串currencyTo=“E”;
十进制双输入=1000m;
Dictionary dic=新字典();
dic.添加(“BU”,1.29米);
dic.添加(“BE”,1.14米);
dic.添加(“BJ”,145.10m);
dic.添加(“BC”,1.68米);
currencyConversion=doubleInput*dic[currencyFrom+currencyTo];

您可以使用字典存储转换率,然后使用更干净的函数进行计算

首先声明一个ConcurrentDictionary(这样您甚至可以安全地动态更新比率)

私有只读静态ConcurrentDictionary转换比率=新建ConcurrentDictionary();
您需要使用“从”和“到”货币对及其各自的比率填充转换比率

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);
}
静态MyClass()
{
转换率.TryAdd(新元组(“B”,“U”),1.29);
转换率.TryAdd(新元组(“B”,“E”),1.14);
转换率.TryAdd(新元组(“B”,“J”),145.10);
转换率.TryAdd(新元组(“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.");
}
专用静态双转换(双双输入、字符串currencyFrom、字符串currencyTo)
{
双倍比率;
if(ConversionRatios.TryGetValue(新元组(currencyFrom、currencyTo、out ratio))
{
返回双输入*比率;
}
//当找不到比率时,处理case,抛出异常或执行任何操作。
抛出新异常(“未找到比率”);
}

您可以使用字典存储转换率,然后使用更干净的函数进行计算

首先声明一个ConcurrentDictionary(这样您甚至可以安全地动态更新比率)

私有只读静态ConcurrentDictionary转换比率=新建ConcurrentDictionary();
您需要使用“从”和“到”货币对及其各自的比率填充转换比率

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);
}
静态MyClass()
{
转换率.TryAdd(新元组(“B”,“U”),1.29);
转换率.TryAdd(新元组(“B”,“E”),1.14);
转换率.TryAdd(新元组(“B”,“J”),145.10);
转换率.TryAdd(新元组(“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.");
}
专用静态双转换(双双输入、字符串currencyFrom、字符串currencyTo)
{
双倍比率;
if(ConversionRatios.TryGetValue(新元组(currencyFrom、currencyTo、out ratio))
{
返回双输入*比率;
}
//当找不到比率时,处理case,抛出异常或执行任何操作。
抛出新异常(“未找到比率”);
}

如果您真的想减少
If语句的数量,并且您的要求允许使用互联网资源,那么我有一个非常简短的代码示例,它使用了Yahoo Finance

异步
方式:

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);
}
public async Task convertCurrencySync(字符串从,字符串到)
{
var uriString=string.Format(“http://finance.yahoo.com/d/quotes.csv?s={0}{1}=X&f=l1“,从,到);
字符串响应=等待新的WebClient()。下载StringTaskAsync(URI字符串);
返回decimal.Parse(响应、系统、全球化、文化信息、不变量文化);
}

有了这些代码,你就有了从任何货币兑换成任何货币的好处,你也有了当前的汇率。

如果你真的想减少
If语句的数量,并且你的要求确实允许使用互联网资源,我有一个非常简短的代码示例,它使用了雅虎财经

异步
方式:

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);
}
public async Task convertCurrencySync(字符串从,字符串到)
{
var uriString=string.Format(“http://finance.yahoo.com/d/quotes.csv?s={0}{1}=X&f=l1“,从,到);
字符串响应=等待新的WebClient()。下载StringTaskAsync(URI字符串);
返回decimal.Parse(响应、系统、全球化、文化信息、不变量文化);
}

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

您可以将换算系数放入
字典中,然后在那里查找配对。请看一看:至少,更改为使用“else if”。目前,您正在进行每一次比较,即使只有一次比较