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(); } }