dor*_*ork 3 c# nested switch-statement
只是想知道如果两个代码块产生相同的结果,哪种方法会更好:
string from = ddFrom.SelectedItem.ToString(),
to = ddTo.SelectedItem.ToString();
switch(from)
{
case "celsius":
switch(to)
{
case "celsius":
break;
case "fahrenheit":
break;
case "kelvin":
break;
}
break;
case "fahrenheit":
switch(to)
{
case "celsius":
break;
case "fahrenheit":
break;
case "kelvin":
break;
}
break;
case "kelvin":
switch(to)
{
case "celsius":
break;
case "fahrenheit":
break;
case "kelvin":
break;
}
break;
}
或者这个:
string from = ddFrom.SelectedItem.ToString(),
to = ddTo.SelectedItem.ToString(),
conversion = from + to;
switch(conversion)
{
case "celsiusfahrenheit":
break;
case "celsiuskelvin":
break;
case "fahrenheitcelsius":
break;
case "fahrenheitkelvin":
break;
case "kelvincelsius":
break;
case "kelvinfahrenheit":
break;
}
谢谢.
Jon*_*Jon 11
第二种选择是可取的,因为正如每个人所说,它使代码看起来更好.
但是,您可能需要考虑更具架构的选项:
public class TemperatureConverter
{
private static readonly IDictionary<Tuple<string, string>, Func<double, double>> ConverterMap =
new Dictionary<Tuple<string, string>, Func<double, double>>
{
{ Tuple.Create("celsius", "kelvin"), t => t + 273 },
// add similar lines to convert from/to other measurements
}
public static double Convert(double degrees, string fromType, string toType)
{
fromType = fromType.ToLowerInvariant();
toType = toType.ToLowerInvariant();
if (fromType == toType) {
return degrees; // no conversion necessary
}
return ConverterMap[Tuple.Create(fromType, toType)](degrees);
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
TemperatureConverter.Convert(0, "celcius", "kelvin");
Run Code Online (Sandbox Code Playgroud)
当然这可以进一步改进(首先考虑使用枚举值而不是温度类型的字符串,还有一些错误检查是有序的),但总体思路是存在的.
恕我直言,这是旧学校C风格大型switch和完全成熟的OO 方法之间的良好中间路线方法(这里没有真正需要OO,因为这个特定的转换问题有一个非常简单的领域模型).