繁体   English   中英

如何缩短 c sharp 中的 if 语句?

[英]How do I shorten my if statements in c sharp?

我正在尝试制作一个公制转换器,您可以在其中输入数字、测量单位和所需的 output 单位(将其转换为什么),并且我还将转换器分离为另一种方法。

该程序接受输入,我唯一能想到的转换方法是将给定数字转换回米,方法是将输入数字除以相当于 1 英里的原始单位,然后乘以所需的 output 单位相当于1米。

double m_Out = 1;  // These are all equivalent to 1 meter        //meter
double mm_Out = 1000;                                            //millimeters
double cm_Out = 100;                                             //centimeters
double mi_Out = 0.000621371192;                                  //miles
double in_Out = 39.3700787;                                      //inches
double km_Out = 0.001;                                           //kilometers
double ft_Out = 3.2808399;                                       //feet
double yd_Out = 1.0936133;                                       //yard

我还使用“double”变量类型来防止输入数字有小数时出现异常。

我想知道除了长行的 if 语句之外是否还有另一种方法。 目前我正在使用多个 if 语句来检查输入单元是什么,以便我们知道它是什么单元以及如何处理它,然后转到另一个 if 语句以查看所需的 output 单元是什么。

这是我现在要使用的代码:

using System;

namespace num4
{
    internal class Program
    {
        static void Converter(double firstNum, string firstUnit, string unitOut)
        {
            double m_Out = 1;
            double mm_Out = 1000;
            double cm_Out = 100;
            double mi_Out = 0.000621371192;
            double in_Out = 39.3700787;
            double km_Out = 0.001;
            double ft_Out = 3.2808399;
            double yd_Out = 1.0936133;

            //convert input back to miles (dividing by its own unit value equivalent to 1 mile) before comverting to desired output unit

            string errornotfound = "Input Unit is not recognized, make sure the units are found on the given list.";

            if (firstUnit == "m") //                                                                    if the input is m
            {
                string unit = "m";
                if (unitOut == "mm")
                {
                    double res = firstNum * mm_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "m")
                {
                    double res = firstNum * m_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "cm")
                {
                    double res = firstNum * cm_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "mi")
                {
                    double res = firstNum * mi_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "in")
                {
                    double res = firstNum * in_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "km")
                {
                    double res = firstNum * km_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "ft")
                {
                    double res = firstNum * ft_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "yd")
                {
                    double res = firstNum * yd_Out;
                    Console.WriteLine(res);
                }
                else
                {
                    Console.WriteLine(errornotfound);
                }
            } 
            else if (firstUnit == "mm") //                                                            If the input is mm
            {
                if (unitOut == "mm")
                {
                    double res = (firstNum / mm_Out) * mm_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "m")
                {
                    double res = (firstNum / mm_Out) * m_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "cm")
                {
                    double res = (firstNum / mm_Out) * cm_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "mi")
                {
                    double res = (firstNum / mm_Out) * mi_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "in")
                {
                    double res = (firstNum / mm_Out) * in_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "km")
                {
                    double res = (firstNum / mm_Out) * km_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "ft")
                {
                    double res = (firstNum / mm_Out) * ft_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "yd")
                {
                    double res = (firstNum / mm_Out) * yd_Out;
                    Console.WriteLine(res);
                }
                else
                {
                    Console.WriteLine(errornotfound);
                }
            }
            else if (firstUnit == "cm")
            {
                if (unitOut == "mm")
                {
                    double res = (firstNum / cm_Out) * mm_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "m")
                {
                    double res = (firstNum / cm_Out) * m_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "cm")
                {
                    double res = (firstNum / cm_Out) * cm_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "mi")
                {
                    double res = (firstNum / cm_Out) * mi_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "in")
                {
                    double res = (firstNum / cm_Out) * in_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "km")
                {
                    double res = (firstNum / cm_Out) * km_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "ft")
                {
                    double res = (firstNum / cm_Out) * ft_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "yd")
                {
                    double res = (firstNum / mm_Out) * yd_Out;
                    Console.WriteLine(res);
                }
                else
                {
                    Console.WriteLine(errornotfound);
                }
            }
            else if (firstUnit == "mi")
            {
                if (unitOut == "mm")
                {
                    double res = (firstNum / mi_Out) * mm_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "m")
                {
                    double res = (firstNum / mi_Out) * m_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "cm")
                {
                    double res = (firstNum / mi_Out) * cm_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "mi")
                {
                    double res = (firstNum / mi_Out) * mi_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "in")
                {
                    double res = (firstNum / mi_Out) * in_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "km")
                {
                    double res = (firstNum / mi_Out) * km_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "ft")
                {
                    double res = (firstNum / mi_Out) * ft_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "yd")
                {
                    double res = (firstNum / mi_Out) * yd_Out;
                    Console.WriteLine(res);
                }
                else
                {
                    Console.WriteLine(errornotfound);
                }
            }
            else if (firstUnit == "in")
            {
                if (unitOut == "mm")
                {
                    double res = (firstNum / in_Out) * mm_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "m")
                {
                    double res = (firstNum / in_Out) * m_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "cm")
                {
                    double res = (firstNum / in_Out) * cm_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "mi")
                {
                    double res = (firstNum / in_Out) * mi_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "in")
                {
                    double res = (firstNum / in_Out) * in_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "km")
                {
                    double res = (firstNum / in_Out) * km_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "ft")
                {
                    double res = (firstNum / in_Out) * ft_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "yd")
                {
                    double res = (firstNum / in_Out) * yd_Out;
                    Console.WriteLine(res);
                }
                else
                {
                    Console.WriteLine(errornotfound);
                }
            }
            else if (firstUnit == "km")
            {
                if (unitOut == "mm")
                {
                    double res = (firstNum / km_Out) * mm_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "m")
                {
                    double res = (firstNum / km_Out) * m_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "cm")
                {
                    double res = (firstNum / km_Out) * cm_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "mi")
                {
                    double res = (firstNum / km_Out) * mi_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "in")
                {
                    double res = (firstNum / km_Out) * in_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "km")
                {
                    double res = (firstNum / km_Out) * km_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "ft")
                {
                    double res = (firstNum / km_Out) * ft_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "yd")
                {
                    double res = (firstNum / km_Out) * yd_Out;
                    Console.WriteLine(res);
                }
                else
                {
                    Console.WriteLine(errornotfound);
                }
            }
            else if (firstUnit == "ft")
            {
                if (unitOut == "mm")
                {
                    double res = (firstNum / ft_Out) * mm_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "m")
                {
                    double res = (firstNum / ft_Out) * m_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "cm")
                {
                    double res = (firstNum / ft_Out) * cm_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "mi")
                {
                    double res = (firstNum / ft_Out) * mi_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "in")
                {
                    double res = (firstNum / ft_Out) * in_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "km")
                {
                    double res = (firstNum / ft_Out) * km_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "ft")
                {
                    double res = (firstNum / ft_Out) * ft_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "yd")
                {
                    double res = (firstNum / ft_Out) * yd_Out;
                    Console.WriteLine(res);
                }
                else
                {
                    Console.WriteLine(errornotfound);
                }
            }
            else if (firstUnit == "yd")
            {
                if (unitOut == "mm")
                {
                    double res = (firstNum / yd_Out) * mm_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "m")
                {
                    double res = (firstNum / yd_Out) * m_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "cm")
                {
                    double res = (firstNum / yd_Out) * cm_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "mi")
                {
                    double res = (firstNum / yd_Out) * mi_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "in")
                {
                    double res = (firstNum / yd_Out) * in_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "km")
                {
                    double res = (firstNum / yd_Out) * km_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "ft")
                {
                    double res = (firstNum / yd_Out) * ft_Out;
                    Console.WriteLine(res);
                }
                else if (unitOut == "yd")
                {
                    double res = (firstNum / yd_Out) * yd_Out;
                    Console.WriteLine(res);
                }
                else
                {
                    Console.WriteLine(errornotfound);
                }
            }
            else
            {
                Console.WriteLine(errornotfound);
            }
        }
        static void Main(string[] args)
        {
            /*Metric Converter
             * Write a program that can convert a given input distance between 8 units of measurement
             * [m,mm,cm,mi,in,km,ft,yd]
             * 
             * 
             * input
             * '''
             * meter(m)
             * 
             * sample input
             * '''m
             * number to convert (6)a
             * type of unit (km)
             * output unit to convert to (ft)r
             * [6km >> ???ft]k
             * -----------------------------
             * start
             * input for num1
             * input for unit1
             * input for out_uni1
             * convert unit>>>>out_uni1
             * print out_uni1
             * end
             * -----------------------------
             */
            string border = "--------------------------------------------------------------";
            Console.WriteLine(border);
            Console.WriteLine("                      Metric Converter");
            Console.WriteLine(border);
           
            Console.Write("What number would you like to convert? ");
            double num1 = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("");
            Console.WriteLine(border);
            Console.WriteLine("Units: [m], [mm], [cm], [mi], [in], [km], [ft], [yd]");
            Console.WriteLine(border);
            Console.Write("What is the original unit? ");
            string inputUnit = Console.ReadLine();
            Console.Write("What unit would you like to convert it to? ");
            string inputOutUnit = Console.ReadLine();
            Console.WriteLine("");
            Console.WriteLine("");
            Console.WriteLine("");
            Console.WriteLine(border);
            Console.Write("The result is: ");
            Converter(num1, inputUnit, inputOutUnit);


            Console.ReadKey();
        }
    }
}

随意添加您的建议,因为我想听听替代方案。

            /*Metric Converter
         * Write a program that can convert a given input distance between 8 units of measurement
         * [m,mm,cm,mi,in,km,ft,yd]
         * 
         * 
         * input
         * '''
         * meter(m)
         * 
         * sample input
         * '''
         * number to convert (6)
         * type of unit (km)
         * output unit to convert to (ft)
         * [6km >> ???ft]
         * -----------------------------mjgs
         * start
         * input for num1
         * input for unit1
         * input for out_uni1
         * convert unit>>>>out_uni1
         * print out_uni1
         * end
         * -----------------------------mjgs
         */

如果您使用的是 C#8 或更高版本,则可以使用新的 switch 表达式来显着缩短此时间。 上面的代码将变成:

static void Converter ( double firstNum, string firstUnit, string unitOut )
{
    //convert input back to miles (dividing by its own unit value equivalent to 1 mile) before comverting to desired output unit

    string errornotfound = "Input Unit is not recognized, make sure the units are found on the given list.";

    try
    {
        var result = firstNum / UnitValue( firstUnit ) * UnitValue( unitOut );
        Console.WriteLine ( result );
    }
    catch
    {
        Console.WriteLine ( errornotfound );
    }

    double UnitValue ( string unit) => unit switch
    {
        "m" => 1,
        "mm" => 1000,
        "cm" => 100,
        "mi" => 0.000621371192,
        "in" => 39.3700787,
        "km" => 0.001,
        "ft" => 3.2808399,
        "yd" => 1.0936133,
        _ => throw new ArgumentException ( "Unkown unit type." )
    };
}

请注意:我只是在回答“如何缩短 c sharp 中的 if 语句?”这个问题。 通过使用 switch 表达式。 我没有评论这是否是最好的方法。 我也使用了本地方法,但可以从Converter方法中提取。

更新:根据@jmcilhinney 的评论,Dictionary<string, double> 也会减少代码:

internal class Program
{
    const string NOTFOUND = "Input Unit is not recognized, make sure the units are found on the given list.";

    private static Dictionary<string, double> values = new Dictionary<string, double>
    {
        ["m"] = 1,
        ["mm"] = 1000,
        ["cm"] = 100,
        ["mi"] = 0.000621371192,
        ["in"] = 39.3700787,
        ["km"] = 0.001,
        ["ft"] = 3.2808399,
        ["yd"] = 1.0936133,
    };

    static string Converter ( double firstNum, string firstUnit, string unitOut )
    {
        //convert input back to miles (dividing by its own unit value equivalent to 1 mile) before comverting to desired output unit

        if ( !values.TryGetValue ( firstUnit, out var value ) )
            return NOTFOUND;

        var firstCalculation = firstNum / value;

        if ( !values.TryGetValue ( unitOut, out value ) )
            return NOTFOUND;

        return ( firstCalculation * value ).ToString ( );
    }

    // ...
}

我想你可以在上面做 switch case 。

switch (firstUnit)
            {
                case "m":
                    switch (unit)
                    {
                        case "mm":
                            res = 0.0;
                            break;
                        default:
                            break;
                    }
                    break;
                case "mm":
                    switch (unit)
                    {
                        case "cm":
                            res = 1.0;
                            break;
                        default:
                            break;
                    }
                    break;
                default:
                    break;
            }

定义枚举

enum Unit
{
    Meter,
    Millimetre,
    Centimeter,
    Mile,
    Inch,
    Kilometer,
    Foot,
    Yard
}

扩展其功能

static class Extensions
{
    public static double InMeters(this Unit unit)
    {
        switch (unit)
        {
            case Unit.Meter:
                return 1;
            case Unit.Millimetre:
                return 0.001;
            case Unit.Centimeter:
                return 0.01;
            case Unit.Mile:
                return 1609.34;
            case Unit.Inch:
                return 0.0254;
            case Unit.Kilometer:
                return 1_000;
            case Unit.Foot:
                return 0.3048;
            case Unit.Yard:
                return 0.9144;
        }
        throw new ArgumentOutOfRangeException();
    }
}

然后使用

static void Main(string[] args)
{
    double value = 100;
    Unit inUnit = Unit.Centimeter;
    Unit outUnit = Unit.Meter;
    var result = value * inUnit.InMeters() / outUnit.InMeters();
    Console.WriteLine(result);
    Console.ReadKey();
}

暂无
暂无

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

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