我有以下两个数据表(DataTable),代表不同时间段的学生的PC分配:
表1:
Timeslot PC1 PC2 PC3
1 A B
2 A B
3 D
4 D
表2:
Timeslot PC1 PC2 PC3
1 C
2 C
3
4
是否可以将这两个DataTable连接到一个DataTable中,如下所示?
通缉:
Timeslot PC1 PC2 PC3
1 A C B
2 A C B
3 D
4 D
我知道,在SQL中,它会非常简单地向左连接,但我不知道如何在C#中使用DataTables来实现这一点。
答案 0 :(得分:1)
如果结果在其中一个源表中合并,则会更短,效率更高:
Table1.Rows.Cast<DataRow>().Join(Table2.Rows.Cast<DataRow>(), a => a[0], b => b[0],
(a, b) => {a[1] += "" + b[1]; a[2] += "" + b[2]; a[3] += "" + b[3]; return a; }).Count();
答案 1 :(得分:0)
这里使用的是LINQ:
var joinData = t1.Select().Join(t2.Select(), j1 => j1["TimeSlot"], j2 => j2["TimeSlot"],
(j1, j2) => new { j1, j2 }).Select(j => new
{
TimeSlot = j.j1["TimeSlot"],
PC1 = (string)j.j1["PC1"] != "" ? j.j1["PC1"] : j.j2["PC1"],
PC2 = (string)j.j1["PC2"] != "" ? j.j1["PC2"] : j.j2["PC2"],
PC3 = (string)j.j1["PC3"] != "" ? j.j1["PC3"] : j.j2["PC3"]
});
var resultTable = new DataTable();
addColumns(resultTable);
foreach(var row in joinData)
{
var dr = resultTable.NewRow().ItemArray = new object[] { row.TimeSlot, row.PC1, row.PC2, row.PC3 };
resultTable.Rows.Add(dr);
WriteLine($"{dr[0]} {dr[1]} {dr[2]} {dr[3]}");
}