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);
                        }
                    }
예제 #2
0
        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));
                        }