【问题标题】:Joining two DataTables in C#在 C# 中连接两个数据表
【发布时间】:2018-07-21 12:11:06
【问题描述】:

我有以下两个数据表 (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

是否可以将这两个DataTables合并为一个DataTable,如下?

通缉:

Timeslot   PC1   PC2  PC3
1          A      C    B
2          A      C    B
3                 D
4                 D

我知道,在 SQL 中,左连接是非常简单的,但我不知道如何在 C# 中使用 DataTables 做到这一点。

【问题讨论】:

标签: c# datatable left-join


【解决方案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();

【讨论】:

  • 我喜欢它。更改原始行的 return a 让我大吃一惊……我以前从未见过。我相信 count 功能只是强制它执行,对吧?非常好。
  • @Obie 是的,可以使用 Count/Last/Max 等来执行查询,而不是 foreach 循环。返回只是因为它必须返回一些东西,而返回什么并不重要。
  • 啊,是的,明白了。谢谢!
【解决方案2】:

这里使用的是 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]}");
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-28
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多