C# 单位转换器 数据结构设计

目前有一简单需求,制作一个单位转换小工具,采用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#来说,就是使用事件)
当任何一个变量更改,就触发事件,更新另外的变量。