这是尝试将温度转换为其他单位的功能
我想将Convert
和Conv
合并为递归函数。
Convert
将所有内容从输入单位转换为参考单位(°C),然后转换为所需单位
这样只需存储转换公式到°C单位和°C
Nb:参考单位应为SI单位°K。但是为了理解,在这个例子中我使用了°C。
此功能转换为:
double value
,作为转换价值tempUnits fromUnit
,从此单位转换。tempUnits toUnit
,转换为此单元。
public double Convert(double value, tempUnits fromUnit, tempUnits toUnit) {
if (toUnit == tempUnits.C)
return Conv(value, fromUnit, toUnit);
if (toUnit != tempUnits.C && fromUnit != tempUnits.C)
{
double temp = Conv(value, fromUnit, tempUnits.C);
return Conv(temp, tempUnits.C, toUnit);
}
if (fromUnit != tempUnits.C)
return Conv(value, fromUnit, tempUnits.C);
return Conv(value, tempUnits.C, toUnit);
}
double Conv(double value, tempUnits fromUnit, tempUnits toUnit) {
return conversionsTable.Where(x => x.From == fromUnit && x.To == toUnit).First().Formule(value);
}
static List<Conversion> conversionsTable
= new List<Conversion> {
// From °C To X :
new Conversion( tempUnits.C, tempUnits.F, (temp) => temp * (9.0/5.0) + 32.0 )
, new Conversion( tempUnits.C, tempUnits.K, (temp) => temp + 273.15)
, new Conversion( tempUnits.C, tempUnits.R, (temp) => (temp + 273.15)*(9.0/.05) )
, new Conversion( tempUnits.C, tempUnits.De, (temp) => (100-temp)*(3.0/2.0) )
, new Conversion( tempUnits.C, tempUnits.N, (temp) => temp+(33.0/100.0) )
, new Conversion( tempUnits.C, tempUnits.Re, (temp) => temp * (4.0/5.0) )
, new Conversion( tempUnits.C, tempUnits.Ro, (temp) => temp * (21.0/40.0) + 7.5 )
// From X To °C :
, new Conversion( tempUnits.F, tempUnits.C, (temp) => (temp-32.0)*(5.0/9.0) )
, new Conversion( tempUnits.K, tempUnits.C, (temp) => temp-273.15 )
, new Conversion( tempUnits.R, tempUnits.C, (temp) => (temp-491.67)*(5.0/9.0) )
, new Conversion( tempUnits.De, tempUnits.C, (temp) => 100-temp*2.0/3.0)
, new Conversion( tempUnits.N, tempUnits.C, (temp) => temp*100.0/33.0 )
, new Conversion( tempUnits.Re, tempUnits.C, (temp) => temp*5.0/4.0 )
, new Conversion( tempUnits.Ro, tempUnits.C, (temp) => (temp-7.5)*40.0/21.0 )
};
class Conversion {
internal tempUnits From;
internal tempUnits To;
internal Func<double, double> Formule;
public Conversion(tempUnits from, tempUnits to, Func<double, double> formule) {
From = from; To = to; Formule = formule;
}
}
enum tempUnits { C, F, K, R, De, N, Re, Ro }