internal static Func <T, T>[][] Build <TUnits, T>() where TUnits : struct, Enum { if (typeof(TUnits) == typeof(Tempurature.Units)) { return(Tempurature.BuildConversionTable <T>()); } int size = Convert <TUnits, int>(Meta.GetLastEnumValue <TUnits>()); Func <T, T>[][] conversionFactorTable = ConstructSquareJaggedArray <Func <T, T> >(size + 1); foreach (Enum A_unit in Enum.GetValues <TUnits>()) { int A = System.Convert.ToInt32(A_unit); foreach (Enum B_unit in Enum.GetValues <TUnits>()) { int B = System.Convert.ToInt32(B_unit); MetricUnitAttribute?A_metric = A_unit.GetEnumAttribute <MetricUnitAttribute>(); MetricUnitAttribute?B_metric = B_unit.GetEnumAttribute <MetricUnitAttribute>(); if (A == B) { conversionFactorTable[A][B] = x => x; } else if (A_metric is not null && B_metric is not null) { int metricDifference = (int)A_metric.MetricUnits - (int)B_metric.MetricUnits; if (metricDifference < 0) { metricDifference = -metricDifference; T factor = Power(Constant <T> .Ten, Convert <int, T>(metricDifference)); conversionFactorTable[A][B] = x => Division(x, factor); } else { T factor = Power(Constant <T> .Ten, Convert <int, T>(metricDifference)); conversionFactorTable[A][B] = x => Multiplication(x, factor); } }
internal static T[][] Build <UNITS, T>() { int size = Convert.ToInt32(Extensions.GetMaxEnumValue <UNITS>()); T[][] conversionFactorTable = Extensions.ConstructSquareJagged <T>(size + 1); foreach (Enum A_unit in Enum.GetValues(typeof(UNITS))) { int A = Convert.ToInt32(A_unit); // handle metric units first MetricUnitAttribute A_metric = A_unit.GetEnumAttribute <MetricUnitAttribute>(); if (!(A_metric is null)) { foreach (Enum B_units in Enum.GetValues(typeof(UNITS))) { int B = Convert.ToInt32(B_units); MetricUnitAttribute B_metric = B_units.GetEnumAttribute <MetricUnitAttribute>(); if (!(B_metric is null)) { int metricDifference = (int)A_metric.MetricUnits - (int)B_metric.MetricUnits; conversionFactorTable[A][B] = Compute.Power(Constant <T> .Ten, Compute.FromInt32 <T>(metricDifference)); }