簡體   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