public DataTable ResultsToDataTable(SimulationResults simulationResults, IModelCoreSimulation simulation)
        {
            //Id	Time	Output1	Output2	...	OutputN
            var dataTable = new DataTable();

            var allQuantities     = _quantityRetriever.QuantitiesFrom(simulation);
            var timeColumnName    = Constants.NameWithUnitFor(TIME, _timeDimension.BaseUnit);
            var quantityPathCache = new Cache <string, string>();

            dataTable.AddColumn <int>(INDIVIDUAL_ID);
            dataTable.AddColumn <string>(timeColumnName);

            if (simulationResults.IsNull())
            {
                return(dataTable);
            }

            var allQuantityPaths = simulationResults.AllQuantityPaths();

            foreach (var quantityPath in allQuantityPaths)
            {
                var quantity = allQuantities[quantityPath];
                if (quantity == null)
                {
                    continue;
                }

                //export results in base unit so that they can be computed automatically from matlab scripts
                quantityPathCache[quantityPath] = Constants.NameWithUnitFor(quantityPath, quantity.Dimension.BaseUnit);
                dataTable.AddColumn <string>(quantityPathCache[quantityPath]);
            }

            dataTable.BeginLoadData();
            int numberOfValues = simulationResults.Time.Length;

            foreach (var individualResults in simulationResults.OrderBy(x => x.IndividualId))
            {
                var allQuantitiesCache = new Cache <string, QuantityValues>(x => x.QuantityPath);
                allQuantitiesCache.AddRange(individualResults);

                for (int i = 0; i < numberOfValues; i++)
                {
                    var row = dataTable.NewRow();
                    row[INDIVIDUAL_ID]  = individualResults.IndividualId;
                    row[timeColumnName] = simulationResults.Time[i].ConvertedTo <string>();

                    foreach (var quantityPath in allQuantityPaths)
                    {
                        var quantity = allQuantities[quantityPath];
                        if (quantity == null)
                        {
                            continue;
                        }

                        row[quantityPathCache[quantityPath]] = allQuantitiesCache[quantityPath][i].ConvertedTo <string>();
                    }

                    dataTable.Rows.Add(row);
                }
            }

            dataTable.EndLoadData();
            return(dataTable);
        }