2017-01-20 14 views
1

Мы пишем приложение для преобразования данных.UnitsNet - лучший способ сделать преобразование единицы времени исполнения.

У нас есть 10 из 1000 уравнений, которые необходимо извлечь в шаблон aka 'model'.

Модель будет принимать наиболее распространенную единицу измерения для заданной системы уравнений.

Затем каждое значение уравнения должно быть скорректировано для обеспечения того, чтобы его значение соответствовало единице измерения на модели.

Итак, я хочу использовать UnitsNet для преобразования значений переменных с заданной исходной переменной и ее единицей в целевое устройство.

Проблема, которую я имею, заключается в том, что во время компиляции мы не знаем, что такое исходный блок, и целевой единицы.

Все, что у нас есть, это аббревиатуры исходной и целевой единицы в уравнении, которое входит во время выполнения (и некоторые из них будут настраиваться).

Простой пример:

Цель Единица измерения: мА (Miliamperes) Источник уравнение: Is = 8А (Ампер)

Мы должны быть в состоянии распознавать единицы измерения из аббревиатуры, сравнить его с целевой блок, а затем соответствующим образом отрегулировать значение:

например в приведенном выше случае мы умножим 8 ампер на 1000, чтобы равняться 8000 Милиампера.

Я не вижу краткий способ сделать это с помощью 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

@anjdreas Любой вход на этот? – JTech

+0

На начальном этапе всего несколько базовых единиц и сотни производных единиц при рассмотрении всех комбинаций и полномочий. Кажется, вам нужна библиотека разных единиц, которая может обрабатывать производные единицы из перегрузки оператора (я сам написал). Это непросто, но, смотря на [UnitsNet] (https://github.com/anjdreas/UnitsNet), это не похоже на хорошую работу для вашего проекта. – ja72

+0

Его проект по электротехнике и из того, что я могу видеть в UnitsNet, сгенерированный код в пространстве имен UnitClasses охватывает большинство вещей, которые нам нужны. Итак, ради вышесказанного, давайте предположим, что нам не нужны никакие юниты, кроме тех, которые включены в UnitsNet, - почему тогда вы сказали бы, что UnitsNet не подходит? – JTech

ответ

0

Это был дан ответ на GitHub: https://github.com/angularsen/UnitsNet/issues/220

Предлагаемое решение

Это дает вам некоторые инструменты для более удобной работы с динамическими преобразований, используя строковые представления величин и единиц.

  • Нового класса UnitConverter
  • Нового свойство 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");