c# - 如果它们具有相同的标题,如何组合数据表但将列添加在一起?(需要指导或资源)
问题描述
我在使用数据表方面是全新的。我正在尝试获取两个数据表并将它们组合起来,如果这两个表的列具有匹配的标题,则将这些列中的数据一起添加到一个新列中。
另一个问题是标题是动态创建的,所以我永远不知道标题的名称是什么。
数据表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);
解决方案
不确定 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” - 您可能需要调整上面的代码以适应您的场景(视为伪代码)
推荐阅读
- ios - 快速过滤 [[NSDisctionary]]
- css - 将一个容器与 display flex 对齐
- python - Python 3.6 对字节数据类型(>>、<<、|、&)的按位运算抛出错误:
- angular - 为什么我应该在 Angular 订阅中使用 select 和管道?
- python-3.x - 读取和写入 Modbus RTU
- angular - 延迟加载功能模块中的问题
- python - 有没有办法在随机数生成器中为样本分配概率?
- image - AR核心不稳定图像跟踪
- kentico - /CMSPages/PortalTemplate.aspx 抛出 404 错误,但站点仍然可以正常工作
- c++ - 如何使用 C++ 计算字符串中的某个单词