目前有一简单需求,制作一个单位转换小工具,采用C# winform,比如长度单位换算,m转cm,m转dm。温度单位换算,摄氏度华氏度等等。因为每个单位转换之间都是双向的,且是多对多的关系,数据结构应该如何设计呢?目前能想到的设计一个类,一个类对应一个单位和其他单位之间的换算关系,如下,
public class FuncUnit
{
public string baseUnit { get; set; } //基础单位
public Dictionary<string, Func<double, double>> otherUnitMap = null; //其他范围与期出单位之间的换算关系
}
把所有单位的换算关系都存储再List list 里面,如温度,
temperatureUnitList.Add(new FuncUnit()
{
baseUnit = "°C",
otherUnitMap = new Dictionary<string, Func<double, double>>() {
{ "°K", v => v + 273.15},
{ "°f", v => 1.8 * v + 32},
{"°R", v => (v + 273.15) * 1.8 }
}
});
temperatureUnitList.Add(new FuncUnit()
{
baseUnit = "°K",
otherUnitMap = new Dictionary<string, Func<double, double>>() {
{ "°C", v => v - 273.15},
{ "°f", v => 1.8 * (v - 273.15) + 32},
{"°R", v => (v - 273.15 + 273.15) * 1.8 }
}
});
temperatureUnitList.Add(new FuncUnit()
{
baseUnit = "°f",
otherUnitMap = new Dictionary<string, Func<double, double>>() {
{ "°C", v => (v - 32) / 1.8},
{ "°K", v => (v - 32)/1.8 + 273.15},
{"°R", v => v - 32 + 1.8 * 273.15 }
}
});
temperatureUnitList.Add(new FuncUnit()
{
baseUnit = "°R",
otherUnitMap = new Dictionary<string, Func<double, double>>() {
{ "°C", v => v/1.8 - 273.15},
{ "°K", v => v/1.8},
{"°f", v => v-1.8*273.15+32}
}
});
计算时候的代码,
Dictionary<string,Func<double,double>> map = list.Find(v => v.baseUnit.Equals(from)).otherUnitMap;
return map[to](value);
温度只填写了四个单位之间的相互换算关系,但是之间的换算有重复,感觉这样做重复代码比较多,感觉不太合理,请教大家是否还有其他更方便的办法呢?十分感谢!
首先创建单位基础字典表:单位主键、单位名称、单位code
然后创建单位换算关系表: 关系主键、源算单位id、目标单位id、换算符号(+ - * /) 、换算系数值
引用chatGPT作答,您的设计是可以工作的,但在设计上有一些重复,可以通过几个优化来改善它。下面是一些建议:
1.双向映射:您可以使用一个双向映射,将每个单位映射到一个整数值,然后将这些整数值用作数组索引,以便更快地查找单位之间的换算关系。例如,您可以使用一个名为 "unitToIndex" 的字典,将每个单位映射到一个整数值。然后,您可以使用一个二维数组,称为 "conversionFactors",将每个单位之间的换算因子存储在该数组中。
2.单位间的通用换算:许多单位之间的换算因子是相同的,您可以使用通用的换算公式来计算这些单位之间的换算关系。例如,您可以使用以下通用公式来计算摄氏度和华氏度之间的换算关系:
F = C * 9 / 5 + 32
您可以使用类似的通用公式来计算其他单位之间的换算关系,从而避免重复代码。
3.缓存计算结果:当您执行单位之间的换算时,您可以缓存已经计算的结果,以避免重复计算。例如,您可以使用一个名为 "conversionCache" 的字典来存储已经计算过的换算结果。
通过使用这些优化,您可以简化您的代码,并提高它的性能和可维护性。
这个用设计模式里面的订阅模式(对于C#来说,就是使用事件)
当任何一个变量更改,就触发事件,更新另外的变量。