【问题标题】:Splitting a DataTable into 2 using a column index使用列索引将 DataTable 拆分为 2
【发布时间】:2014-04-14 06:39:31
【问题描述】:

我有一个存储过程,它选择表中行之间的差异并以下列格式返回DataTable

col1_A, col2_A, col3_A, col1_B, col2_B, col3B

我想将 DataTable 拆分为 2 个单独的 DataTables,这样看起来像

表A

col1
col2
col3

表B

col1
col2
col3

这段代码让我得到了列索引。

        foreach (DataColumn col in DT.Columns)
        {
            if (!col.ColumnName.EndsWith("B"))
                tableBIndex += 1;
            else
                break;
        }

但是从这里我不确定如何将行分成 2 个数据表。关于实现这一目标的最佳方法的任何想法?

【问题讨论】:

    标签: c# asp.net sql-server datatable


    【解决方案1】:

    我建议创建两个新表并复制出这样的值。

    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]);
        }
      }
    }
    

    【讨论】:

    【解决方案2】:

    这应该可以解决问题并在一个循环中填充两个表:

    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
    • 非常快的解决方案,SetField() 的想法很好!
    猜你喜欢
    • 2012-09-14
    • 1970-01-01
    • 2015-10-24
    • 2018-08-11
    • 1970-01-01
    • 2010-12-30
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多