private List <Tuple <Tuple <Molecule, int>, string> > CreateConversionInfo(ChemicalEquation equation)
        {
            List <Tuple <Tuple <Molecule, int>, string> > header = null;

            if (equation.IsBalanced())
            {
                header = new List <Tuple <Tuple <Molecule, int>, string> >();

                var combined = equation.Reactants.Concat(equation.Products);

                foreach (var molecule in combined)
                {
                    header.Add(Tuple.Create(molecule, "mass"));
                    header.Add(Tuple.Create(molecule, "moles"));
                    header.Add(Tuple.Create(molecule, "particles"));
                }
            }

            return(header);
        }
        public void CreateConversionTable(ChemicalEquation equation)
        {
            var tableData = new List <List <string> >();

            if (equation.IsBalanced())
            {
                var conversionInfo = CreateConversionInfo(equation);
                var columnHeader   = conversionInfo.Select(molecule => $"{molecule.Item1.Item2}{molecule.Item1.Item1.ToString()} {molecule.Item2}").ToList();
                tableData.Add(columnHeader);

                // Adds the conversion type of the table.
                tableData[0].Insert(0, equation.ToString());

                for (var rowIndex = 1; rowIndex < columnHeader.Count; ++rowIndex)
                {
                    var rowHeader = columnHeader[rowIndex];

                    if (tableData.Count == rowIndex)
                    {
                        tableData.Add(new List <string>());
                        tableData[rowIndex].Add(rowHeader);
                        tableData[rowIndex].AddRange(new string[rowIndex - 1]);
                    }

                    for (var colIndex = rowIndex; colIndex < columnHeader.Count; ++colIndex)
                    {
                        var canceledUnit     = conversionInfo[rowIndex - 1];
                        var remainingUnit    = conversionInfo[colIndex - 1];
                        var conversionScalar = CreateConversionScalar(canceledUnit, remainingUnit);

                        tableData[rowIndex].Add(conversionScalar.ToString());
                    }
                }

                UnitConverter.ConversionTable = UnitConverter.CreateConversionTable(tableData).Transpose();
            }
        }