我们正在编写数据转换应用程序。
我们需要将1000个方程式中的10个提取到模板中,即“模型”。
模型将采用给定方程组的最常用度量单位。
然后必须调整每个等式的值,以确保其值对应于模型上的度量单位。
因此,我希望使用UnitsNet将给定源变量及其单位的变量值转换为目标单位。
我遇到的问题是我们在编译时不知道源单元是什么,也不知道目标单元。
我们所拥有的是在运行时出现的等式中的源和目标单位字符串缩写(其中一些将是自定义单位)。
简单示例:
目标单位:mA(Miliamperes) 源方程:Is = 8A(安培)
我们需要能够从缩写中识别度量单位,将其与目标单位进行比较,然后相应地调整值:
e.g。在上述情况下,我们将8安培乘以1000,等于8000 Miliamperes。
我无法通过UnitsNet看到一种简洁的方法。
这样的原始内容就是我到目前为止(这是用xUnit编写的单元测试):
[Theory]
[InlineData("A", "mA", "8")]
public void DoConversion(string sourceUnit, string targetUnit, string variableValue)
{
double result = 0;
ElectricCurrent sourceCurrent;
if (ElectricCurrent.TryParse($"{variableValue}{sourceUnit}", out sourceCurrent))
{
ElectricCurrent targetCurrent;
if (ElectricCurrent.TryParse($"1{targetUnit}", out targetCurrent))
{
var electricCurrentUnit = GetElectricCurrentUnitFromAbbreviation(targetUnit);
if (electricCurrentUnit == ElectricCurrentUnit.Ampere)
{
result = sourceCurrent.Amperes;
}
if (electricCurrentUnit == ElectricCurrentUnit.Milliampere)
{
result = sourceCurrent.Milliamperes;
}
}
}
result.Should().Be(8000);
// TODO: Add every other combination of all possible Units and their Scales- OMG!!!
}
private ElectricCurrentUnit GetElectricCurrentUnitFromAbbreviation(string abbreviation)
{
// Is there a better way to determine WHICH ElectricCurrentUnit the target is?
if (abbreviation == "A")
return ElectricCurrentUnit.Ampere;
if (abbreviation == "mA")
return ElectricCurrentUnit.Milliampere;
return ElectricCurrentUnit.Undefined;
}
但是我们必须满足的可能单位列表很大,所以我不想这样写。
似乎必须有更好的方法。
非常感谢您对此的专业见解。
答案 0 :(得分:0)
这是在github上回答的:https://github.com/angularsen/UnitsNet/issues/220
这为您提供了一些工具,可以使用数量和单位的字符串表示更轻松地使用动态转换。
Units
,LengthUnit[] Units { get; }
上的Length
UnitClass
枚举至QuantityType
这允许以下场景:
// Get quantities for populating quantity UI selector
QuantityType[] quantityTypes = Enum.GetValues(typeof(QuantityType)).Cast<QuantityType>().ToArray();
// If Length is selected, get length units for populating from/to UI selectors
LengthUnit[] lengthUnits = Length.Units;
// Perform conversion by using .ToString() on selected units
double centimeters = UnitConverter.ConvertByName(5, "Length", "Meter", "Centimeter");
double centimeters2 = UnitConverter.ConvertByAbbreviation(5, "Length", "m", "cm");