Как перенести таблицу данных, чтобы получить вторую таблицу данных в C#? - PullRequest
0 голосов
/ 06 мая 2020

Я новый разработчик C#, и сейчас я пытаюсь преобразовать столбцы в следующей таблице данных в строки. Текущая структура DataTable, которая у меня есть:

Id      Value
1       Test#1
1       Test#2
2       Car#1
2       Car#2
3       Airplane#1
3       Airplane#2

Мне нужно преобразовать ее в следующую структуру таблицы:

1           2           3
Test#1      Car#1       Airplane#1
Test#2      Car#2       Airplane#2

Я попытался реализовать его, используя следующий метод, который я нашел в Google , но я все еще не получаю желаемого результата:

private DataTable GenerateTransposedTable(DataTable inputTable)
        {
            DataTable outputTable = new DataTable();

            // Add columns by looping rows

            // Header row's first column is same as in inputTable
            outputTable.Columns.Add(inputTable.Columns[0].ColumnName.ToString());

            // Header row's second column onwards, 'inputTable's first column taken
            foreach (DataRow inRow in inputTable.Rows)
            {
                string newColName = inRow[0].ToString();
                outputTable.Columns.Add(newColName);
            }

            // Add rows by looping columns      
            for (int rCount = 1; rCount <= inputTable.Columns.Count - 1; rCount++)
            {
                DataRow newRow = outputTable.NewRow();

                // First column is inputTable's Header row's second column
                newRow[0] = inputTable.Columns[rCount].ColumnName.ToString();
                for (int cCount = 0; cCount <= inputTable.Rows.Count - 1; cCount++)
                {
                    string colValue = inputTable.Rows[cCount][rCount].ToString();
                    newRow[cCount + 1] = colValue;
                }
                outputTable.Rows.Add(newRow);
            }

            return outputTable;
        }

Не могли бы вы рассказать мне, как я могу транспонировать первый DataTable во второй?

1 Ответ

0 голосов
/ 07 мая 2020

Используя метод расширения, вы можете развернуть исходный DataTable, создав столбец предполагаемых номеров строк, который группирует строки ответов вместе:

public static class DataTableExt {
    // Transpose a DataTable to a new DataTable
    // over field creates new column names
    // value field is value for new columns
    // Original datatable must be sorted in OverColFieldName then row number order
    public static DataTable Transpose(this DataTable dt, string OverColFieldName, string WithValueFieldName) {
        var res = new DataTable();
        if (dt.Rows.Count > 0) {
            var ColCount = dt.AsEnumerable().Select(r => r.Field<int>(OverColFieldName)).Distinct().Count();
            var rowCount = dt.Rows.Count / ColCount;
            var rowNumbers = Enumerable.Range(0, rowCount*ColCount).Select(rn => rn % rowCount +1);

            var rowGroups = dt.AsEnumerable()
                              .Zip(rowNumbers, (r, rn) => new { Row = r, RowNum = rn }) // associate an answer Row Number with each row
                              .GroupBy(rrn => rrn.RowNum, rrn => new { Over = rrn.Row[OverColFieldName].ToString(), With = rrn.Row[WithValueFieldName] }); // group the columns for each answer row together

            var valueDataType = dt.Columns[WithValueFieldName].DataType;
            var colNames = rowGroups.SelectMany(rg => rg.Select(r => r.Over)).Distinct().OrderBy(n => n);
            foreach (var n in colNames)
                res.Columns.Add(n, valueDataType);

            foreach (var rowGroup in rowGroups) {
                var newr = res.NewRow();

                foreach (var r in rowGroup)
                    newr[r.Over] = r.With;
                res.Rows.Add(newr);
            }
        }
        return res;
    }
}

И вы можете использовать его, передав имена столбцов для источника новых столбцов и значений, которые будут помещены в каждый столбец:

var ans = dt.Transpose("Id", "Value");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...