首页 > 解决方案 > 如果它们具有相同的标题,如何组合数据表但将列添加在一起?(需要指导或资源)

问题描述

我在使用数据表方面是全新的。我正在尝试获取两个数据表并将它们组合起来,如果这两个表的列具有匹配的标题,则将这些列中的数据一起添加到一个新列中。

另一个问题是标题是动态创建的,所以我永远不知道标题的名称是什么。

数据表1:

队名 日期1 日期2
第一的 整数值 整数值
第二 整数值 整数值

数据表2:

队名 日期2 日期3
第一的 整数值 整数值
第二 整数值 整数值

新表:

队名 日期1 日期2 日期3
第一的 整数值 整数值1 + 整数值2 整数值
第二 整数值 整数值1 + 整数值2 整数值

如果有人对如何开始使用 C# 和/或 LINQ 进行此操作有任何见解,我将不胜感激。

我有一些代码,但它只是通过包含所有内容来组合表格,它基本上看起来就像两个表格并排,没有混合在一起。

 DataTable targetTable = dt1.Clone();
 var dt2Columns = dt2.Columns.OfType<DataColumn>().Select(dc =>
            new DataColumn(dc.ColumnName, dc.DataType, dc.Expression, dc.ColumnMapping));
var dt2FinalColumns = from dc in dt2Columns.AsEnumerable()
                 where targetTable.Columns.Contains(dc.ColumnName) == false
                                  select dc;
 targetTable.Columns.AddRange(dt2FinalColumns.ToArray());
 var rowData = from row1 in dt1.AsEnumerable()
              join row2 in dt2.AsEnumerable()
             on row1.Field<string>("ScrumTeam") equals row2.Field<string>("ScrumTeam")
                          select row1.ItemArray.Concat(row2.ItemArray.Where(r2 => row1.ItemArray.Contains(r2) == false)).ToArray();
foreach (object[] values in rowData)
      targetTable.Rows.Add(values);

标签: c#linqdatatable

解决方案


不确定 LINQ 是否让您的生活更轻松

//ensure the dt2 column exists in dt1
foreach(DataColumn dc2 in dt2.Columns)
  if(!dt1.Columns.Contains(dc2.ColumnName))
    dt1.Columns.Add(dc2.Name, dc2.DataType);

//index the rows
var d = dt1.Rows.Cast<DataRow>().ToDictionary(r => r["TeamName"]);

//merge the tables, dt2 into dt1
foreach(DataRow r2 in dt2){
  DataRow r1;

  //handle dt2 team name absence from dt1
  if(!d.ContainsKey(r2["TeamName"])){
    d[r2["TeamName"]] = r1 = dt.NewRow();
    dt1.AddRow(r1);
  }

  //index now surely contains r1; get it
  r1 = d[r2["TeamName"]];

  //merge data from 2 into 1
  foreach(DataColumn dc2 in dt2.Columns){

    //skip the PK
    if(dc2.ColumnName == "TeamName")
      continue;

    //all the values seem to be int. if not true add some "if type is..." handling here
    r1[dc2.ColumnName] = (int)r1[dc2.ColumnName] + (int)r2[dc2.ColumnName];
  }
}

您的代码显示“ScrumTeam”但问题表显示“TeamName” - 您可能需要调整上面的代码以适应您的场景(视为伪代码)


推荐阅读