static void AddConversionConstant(string fromUnitStr, ExpressionUnits toUnit, double mult, double add = 0, ConversionConstantAttr attr = ConversionConstantAttr.None)
        {
            var fromUnit = new ExpressionUnits(fromUnitStr);

            conversionConstants[fromUnitStr] = new ExpressionUnitsConversion(fromUnit, toUnit, mult, add);

            List <Tuple <string, double> > addList = null;

            switch (attr)
            {
            case ConversionConstantAttr.SIPrefix:
                addList = new List <Tuple <string, double> >
                {
                    Tuple.Create("da", 1e1d),
                    Tuple.Create("h", 1e2d),
                    Tuple.Create("k", 1e3d),
                    Tuple.Create("M", 1e6d),
                    Tuple.Create("G", 1e9d),
                    Tuple.Create("g", 1e9d),
                    Tuple.Create("T", 1e12d),
                    Tuple.Create("t", 1e12d),
                    Tuple.Create("P", 1e15d),
                    Tuple.Create("E", 1e18d),
                    Tuple.Create("e", 1e18d),
                    Tuple.Create("Z", 1e21d),
                    Tuple.Create("Y", 1e24d),
                    Tuple.Create("d", 1e-1d),
                    Tuple.Create("c", 1e-2d),
                    Tuple.Create("m", 1e-3d),
                    Tuple.Create("µ", 1e-6d),
                    Tuple.Create("n", 1e-9d),
                    Tuple.Create("p", 1e-12d),
                    Tuple.Create("f", 1e-15d),
                    Tuple.Create("a", 1e-18d),
                    Tuple.Create("z", 1e-21d),
                    Tuple.Create("y", 1e-24d),
                };
                break;

            case ConversionConstantAttr.SILongPrefix:
                addList = new List <Tuple <string, double> >
                {
                    Tuple.Create("deca", 1e1d),
                    Tuple.Create("hecto", 1e2d),
                    Tuple.Create("kilo", 1e3d),
                    Tuple.Create("mega", 1e6d),
                    Tuple.Create("giga", 1e9d),
                    Tuple.Create("tera", 1e12d),
                    Tuple.Create("peta", 1e15d),
                    Tuple.Create("exa", 1e18d),
                    Tuple.Create("zetta", 1e21d),
                    Tuple.Create("yotta", 1e24d),
                    Tuple.Create("deci", 1e-1d),
                    Tuple.Create("centi", 1e-2d),
                    Tuple.Create("milli", 1e-3d),
                    Tuple.Create("micro", 1e-6d),
                    Tuple.Create("nano", 1e-9d),
                    Tuple.Create("pico", 1e-12d),
                    Tuple.Create("femto", 1e-15d),
                    Tuple.Create("atto", 1e-18d),
                    Tuple.Create("zepto", 1e-21d),
                    Tuple.Create("yocto", 1e-24d),
                };
                break;

            case ConversionConstantAttr.CPrefix:
                addList = new List <Tuple <string, double> >
                {
                    Tuple.Create("K", 1024d),
                    Tuple.Create("k", 1024d),
                    Tuple.Create("M", 1048576d),
                    Tuple.Create("m", 1048576d),
                    Tuple.Create("G", 1073741824d),
                    Tuple.Create("g", 1073741824d),
                    Tuple.Create("T", 1099511627776d),
                    Tuple.Create("t", 1099511627776d),
                    Tuple.Create("P", 1125899906842624d),
                    Tuple.Create("p", 1125899906842624d),
                    Tuple.Create("E", 1152921504606846976d),
                    Tuple.Create("e", 1152921504606846976d),
                    Tuple.Create("Z", 1180591620717411303424d),
                    Tuple.Create("z", 1180591620717411303424d),
                    Tuple.Create("Y", 1208925819614629174706176d),
                    Tuple.Create("y", 1208925819614629174706176d),
                };
                break;

            case ConversionConstantAttr.CLongPrefix:
                addList = new List <Tuple <string, double> >
                {
                    Tuple.Create("kilo", 1024d),
                    Tuple.Create("mega", 1048576d),
                    Tuple.Create("giga", 1073741824d),
                    Tuple.Create("tera", 1099511627776d),
                    Tuple.Create("peta", 1125899906842624d),
                    Tuple.Create("exa", 1152921504606846976d),
                    Tuple.Create("zetta", 1180591620717411303424d),
                    Tuple.Create("yotta", 1208925819614629174706176d),
                };
                break;

            default: return;
            }

            foreach (var tuple in addList)
            {
                var newFromUnit = new ExpressionUnits(tuple.Item1 + fromUnitStr);
                conversionConstants[newFromUnit.Single().Unit] = new ExpressionUnitsConversion(newFromUnit, fromUnit, tuple.Item2, add);
            }
        }
		static void AddConversionConstant(string fromUnitStr, ExpressionUnits toUnit, double mult, double add = 0, ConversionConstantAttr attr = ConversionConstantAttr.None)
		{
			var fromUnit = new ExpressionUnits(fromUnitStr);
			conversionConstants[fromUnitStr] = new ExpressionUnitsConversion(fromUnit, toUnit, mult, add);

			List<Tuple<string, double>> addList = null;
			switch (attr)
			{
				case ConversionConstantAttr.SIPrefix:
					addList = new List<Tuple<string, double>>
					{
						Tuple.Create("da", 1e1d),
						Tuple.Create("h", 1e2d),
						Tuple.Create("k", 1e3d),
						Tuple.Create("M", 1e6d),
						Tuple.Create("G", 1e9d),
						Tuple.Create("g", 1e9d),
						Tuple.Create("T", 1e12d),
						Tuple.Create("t", 1e12d),
						Tuple.Create("P", 1e15d),
						Tuple.Create("E", 1e18d),
						Tuple.Create("e", 1e18d),
						Tuple.Create("Z", 1e21d),
						Tuple.Create("Y", 1e24d),
						Tuple.Create("d", 1e-1d),
						Tuple.Create("c", 1e-2d),
						Tuple.Create("m", 1e-3d),
						Tuple.Create("µ", 1e-6d),
						Tuple.Create("n", 1e-9d),
						Tuple.Create("p", 1e-12d),
						Tuple.Create("f", 1e-15d),
						Tuple.Create("a", 1e-18d),
						Tuple.Create("z", 1e-21d),
						Tuple.Create("y", 1e-24d),
					};
					break;
				case ConversionConstantAttr.SILongPrefix:
					addList = new List<Tuple<string, double>>
					{
						Tuple.Create("deca", 1e1d),
						Tuple.Create("hecto", 1e2d),
						Tuple.Create("kilo", 1e3d),
						Tuple.Create("mega", 1e6d),
						Tuple.Create("giga", 1e9d),
						Tuple.Create("tera", 1e12d),
						Tuple.Create("peta", 1e15d),
						Tuple.Create("exa", 1e18d),
						Tuple.Create("zetta", 1e21d),
						Tuple.Create("yotta", 1e24d),
						Tuple.Create("deci", 1e-1d),
						Tuple.Create("centi", 1e-2d),
						Tuple.Create("milli", 1e-3d),
						Tuple.Create("micro", 1e-6d),
						Tuple.Create("nano", 1e-9d),
						Tuple.Create("pico", 1e-12d),
						Tuple.Create("femto", 1e-15d),
						Tuple.Create("atto", 1e-18d),
						Tuple.Create("zepto", 1e-21d),
						Tuple.Create("yocto", 1e-24d),
					};
					break;
				case ConversionConstantAttr.CPrefix:
					addList = new List<Tuple<string, double>>
					{
						Tuple.Create("K", 1024d),
						Tuple.Create("k", 1024d),
						Tuple.Create("M", 1048576d),
						Tuple.Create("m", 1048576d),
						Tuple.Create("G", 1073741824d),
						Tuple.Create("g", 1073741824d),
						Tuple.Create("T", 1099511627776d),
						Tuple.Create("t", 1099511627776d),
						Tuple.Create("P", 1125899906842624d),
						Tuple.Create("p", 1125899906842624d),
						Tuple.Create("E", 1152921504606846976d),
						Tuple.Create("e", 1152921504606846976d),
						Tuple.Create("Z", 1180591620717411303424d),
						Tuple.Create("z", 1180591620717411303424d),
						Tuple.Create("Y", 1208925819614629174706176d),
						Tuple.Create("y", 1208925819614629174706176d),
					};
					break;
				case ConversionConstantAttr.CLongPrefix:
					addList = new List<Tuple<string, double>>
					{
						Tuple.Create("kilo", 1024d),
						Tuple.Create("mega", 1048576d),
						Tuple.Create("giga", 1073741824d),
						Tuple.Create("tera", 1099511627776d),
						Tuple.Create("peta", 1125899906842624d),
						Tuple.Create("exa", 1152921504606846976d),
						Tuple.Create("zetta", 1180591620717411303424d),
						Tuple.Create("yotta", 1208925819614629174706176d),
					};
					break;
				default: return;
			}

			foreach (var tuple in addList)
			{
				var newFromUnit = new ExpressionUnits(tuple.Item1 + fromUnitStr);
				conversionConstants[newFromUnit.Single().Unit] = new ExpressionUnitsConversion(newFromUnit, fromUnit, tuple.Item2, add);
			}
		}