C# 尝试使用C将行转换为列

C# 尝试使用C将行转换为列,c#,asp.net,datatable,webforms,dataset,C#,Asp.net,Datatable,Webforms,Dataset,下面是我正在使用的代码 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(inputT

下面是我正在使用的代码

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();
        DataColumnCollection columns = outputTable.Columns;
        if (!columns.Contains(newColName))//code to check duplication of columns
        {
            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();
            //int rowcount = cCount + 1;
            //if (cCount <= rowcount)
            //{
            newRow[cCount + 1] = colValue; //**Error here when starts second record**
            //}
        }
        outputTable.Rows.Add(newRow);
    }

    //for (int i = outputTable.Rows.Count - 1; i >= 0; i--)
        for (int j = 0; j < outputTable.Columns.Count;j++)
        {
            for (int k = 0; k < outputTable.Rows.Count; k++)
            {
                string sdfsdf = outputTable.Rows[k][j].ToString();
                if (outputTable.Rows[k][j].ToString() == "0")
                {
                    DataRow dr = outputTable.Rows[k];
                    dr.Delete();
                }

            }

        }
        outputTable.AcceptChanges();
    return outputTable;
} 
我需要如下输出:示例的列名我在这里只指定了一些列,我需要在datatable中获得的所有列

 CandidateId           Last Name                Email              Mobile  etc
 3215456454454           demo1                 demo1@gmail.com      00000000
 2515456564              demo2                  test@gmail.com       354564654

好的,这是我的,你需要测试一下。我认为最好将xml转换为对象,但这是另一个问题

这将适用于任何数据,因此,如果您的xml发生了更改,那么这仍然有效

public DataTable convertTable(DataTable inputTable, int columnNameIndex = 0, int columnValueIndex = 1)
    {
        var outputTable = new DataTable();

        //Get the names of the columns for the output table
        var columnNames = inputTable.AsEnumerable().Where(x => x[columnNameIndex] != DBNull.Value && x[columnValueIndex] != DBNull.Value)
                                                        .Select(x => x[columnNameIndex].ToString()).Distinct().ToList();
        DataRow outputRow = outputTable.NewRow();

        //create the columns in the output table
        foreach (var columnName in columnNames)
        {
            outputTable.Columns.Add(new DataColumn(columnName));
        }

        //get all the rows in the input table
        var totalRows = inputTable.Rows.Count;

        //loop through the input table
        for (int n = 0; n < totalRows; n++)
        {
            //loop through each columnname for each row
            for (int i = 0; i < columnNames.Count; i++)
            {
                //if it's the first loop we need a new row
                if (i == 0)
                {
                    outputRow = outputTable.NewRow();
                }

                outputRow[columnNames[i]] = inputTable.Rows[n][columnValueIndex].ToString();
                   //^^get the corresponding value from the input table
                
                //if it's the last loop all columns 
                //have values added so add the row to the input table
                if (i == columnNames.Count - 1)
                    outputTable.Rows.Add(outputRow);

            }
        }

        return outputTable;
}

列名是动态的吗?i、 e在第一个表最左边的列中?或者它们总是一样的?列名我从zoho recruit API中获得的XML字符串,我将其转换为datatable,当我转换为datatable时,我将获得以前的post格式,但我希望获得候选ID姓氏电子邮件手机3215456454454演示1demo1@gmail.com00000000 25154564演示2test@gmail.com354564654是的列名是动态的,在这种情况下,您不需要将其转换为datatable。你可以转换成一个对象,如果你愿意,我可以把它作为答案添加。我可以发布动态数据表答案和对象答案。给我点时间整理一下。安静的工作哈好谢谢你,我会检查并标记你作为确认后的答案@Sean TI进行了编辑-没有注意到将值放入输出表的行是条件ifi==0{}
public DataTable convertTable(DataTable inputTable, int columnNameIndex = 0, int columnValueIndex = 1)
    {
        var outputTable = new DataTable();

        //Get the names of the columns for the output table
        var columnNames = inputTable.AsEnumerable().Where(x => x[columnNameIndex] != DBNull.Value && x[columnValueIndex] != DBNull.Value)
                                                        .Select(x => x[columnNameIndex].ToString()).Distinct().ToList();
        DataRow outputRow = outputTable.NewRow();

        //create the columns in the output table
        foreach (var columnName in columnNames)
        {
            outputTable.Columns.Add(new DataColumn(columnName));
        }

        //get all the rows in the input table
        var totalRows = inputTable.Rows.Count;

        //loop through the input table
        for (int n = 0; n < totalRows; n++)
        {
            //loop through each columnname for each row
            for (int i = 0; i < columnNames.Count; i++)
            {
                //if it's the first loop we need a new row
                if (i == 0)
                {
                    outputRow = outputTable.NewRow();
                }

                outputRow[columnNames[i]] = inputTable.Rows[n][columnValueIndex].ToString();
                   //^^get the corresponding value from the input table
                
                //if it's the last loop all columns 
                //have values added so add the row to the input table
                if (i == columnNames.Count - 1)
                    outputTable.Rows.Add(outputRow);

            }
        }

        return outputTable;
}