使用列索引将DataTable拆分为2个

5
我有一个存储过程,它选择表中行之间的差异并返回以下格式的DataTable
col1_A, col2_A, col3_A, col1_B, col2_B, col3B

我想把 DataTable 分成两个独立的 DataTable,让它看起来像这样:

TableA

col1
col2
col3

TableB (表B)
col1
col2
col3

这段代码可以获取列的索引。
        foreach (DataColumn col in DT.Columns)
        {
            if (!col.ColumnName.EndsWith("B"))
                tableBIndex += 1;
            else
                break;
        }

但是我不确定如何将行分成两个数据表。有什么建议来完成这个任务吗?
2个回答

4
这应该可以解决问题并在一个循环中填充两个表格:
DataColumn[] aCols = table.Columns.Cast<DataColumn>()
    .Where(c => c.ColumnName.EndsWith("A"))
    .Select(c => new DataColumn(c.ColumnName, c.DataType))
    .ToArray();
DataColumn[] bCols = table.Columns.Cast<DataColumn>()
    .Where(c => c.ColumnName.EndsWith("B"))
    .Select(c => new DataColumn(c.ColumnName, c.DataType))
    .ToArray();

var TableA = new DataTable();
TableA.Columns.AddRange(aCols);
var TableB = new DataTable();
TableB.Columns.AddRange(bCols);

foreach (DataRow row in table.Rows)
{ 
    DataRow aRow = TableA.Rows.Add();
    DataRow bRow = TableB.Rows.Add();
    foreach (DataColumn aCol in aCols)
        aRow.SetField(aCol, row[aCol.ColumnName]);
    foreach (DataColumn bCol in bCols)
        bRow.SetField(bCol, row[bCol.ColumnName]);
}

很棒的答案。我之前参考了你的代码来创建自己的答案。我喜欢在一个循环中完成。+1 - crthompson
非常快的解决方案,使用SetField()的思路很好! - Evan L

2
我建议创建两个新表,并按此方式复制值。
DataTable one = new DataTable();
DataTable two = new DataTable();
foreach (DataColumn col in DT.Columns)
{
  if (!col.ColumnName.EndsWith("B"))
  {
    one.Columns.Add(col.ColumnName.Replace("_A", ""));
    foreach (DataRow row in DT.Rows)
    {
      one.Rows.Add(row[col.ColumnName]);
    }
  }
  else
  {
    one.Columns.Add(col.ColumnName.Replace("_B", ""));
    foreach (DataRow row in DT.Rows)
    {
      two.Rows.Add(row[col.ColumnName]);
    }
  }
}

这个问题怎么样:https://dev59.com/fozda4cB1Zd3GeqPqcGx - SearchForKnowledge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接