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