[英]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.