public FinanceReportTable Expand(IList <string> orderedRowNames, IList <string> orderedColumnText, IList <DateTime> orderedColumnDate)
        {
            var columnDefinitions = new FinanceReportColumnDefinition[orderedColumnDate.Count + orderedColumnText.Count];

            for (int i = 0; i < orderedColumnDate.Count; ++i)
            {
                columnDefinitions[i] = new FinanceReportColumnDefinition(orderedColumnDate[i]);
            }

            for (int i = 0; i < orderedColumnText.Count; ++i)
            {
                columnDefinitions[i + orderedColumnDate.Count] = new FinanceReportColumnDefinition(orderedColumnText[i]);
            }

            FinanceReportTable table = new FinanceReportTable(Name, RowDefinition, Unit, columnDefinitions);

            table._rows = new List <FinanceReportRow>();

            for (int i = 0; i < orderedRowNames.Count; ++i)
            {
                table._rows.Add(new FinanceReportRow(orderedRowNames[i], table._columnDefinitions, table.Unit));
            }

            // build old row index to new row index map and old column index to new column index
            int[] rowMap = new int[_rows.Count];
            for (int i = 0; i < _rows.Count; ++i)
            {
                rowMap[i] = orderedRowNames.IndexOf(_rows[i].Name);
            }

            int[] columnMap = new int[_columnDefinitions.Length];
            for (int i = 0; i < _columnDefinitions.Length; ++i)
            {
                if (_columnDefinitions[i].Type == FinanceReportColumnDefinition.ColumnType.Date)
                {
                    columnMap[i] = orderedColumnDate.IndexOf(_columnDefinitions[i].Date);
                }
                else
                {
                    columnMap[i] = orderedColumnText.IndexOf(_columnDefinitions[i].Text);
                    if (columnMap[i] >= 0)
                    {
                        columnMap[i] += orderedColumnDate.Count;
                    }
                }
            }

            // copy data from old table to new table
            for (int i = 0; i < _rows.Count; ++i)
            {
                for (int j = 0; j < _columnDefinitions.Length; ++j)
                {
                    table._rows[rowMap[i]][columnMap[j]].Copy(_rows[i][j]);
                }
            }

            return(table);
        }
        public FinanceReportTable(string name, string rowDefinition, string[] columnDefinitions)
        {
            if (columnDefinitions == null || columnDefinitions.Length == 0)
            {
                throw new ArgumentNullException("columnDefinitions");
            }

            _columnDefinitions = new FinanceReportColumnDefinition[columnDefinitions.Length];
            for (int i = 0; i < _columnDefinitions.Length; ++i)
            {
                _columnDefinitions[i] = new FinanceReportColumnDefinition(columnDefinitions[i]);
            }

            Name = name;

            string  cleanedRowDefinition;
            decimal unit;

            FinanceReportHelper.ParseDefinitionAndUnit(rowDefinition, 1.0M, out cleanedRowDefinition, out unit);

            Unit          = unit;
            RowDefinition = cleanedRowDefinition;
        }