我有一个DataTable
T1 , M 列,另一个DataTable
T2 N < / strong>列,它们的行数相同。
我想将 T1 和 T2 合并到另一个DataTable
T 中,以便生成的表 T 包含 M + N 列数。
在C#中有没有简单的方法,我的意思是不使用Loop。
答案 0 :(得分:1)
您可以使用LINQ外连接查询并从两个表中获取数据到最终表。
下面的示例代码 //First DataTable
DataTable dt = new DataTable();
DataColumn dc = new DataColumn("ID");
DataColumn dc1 = new DataColumn("Name");
dt.Columns.AddRange(new DataColumn[] {dc, dc1 });
DataRow dr = dt.NewRow();
dr[dc] = "1";
dr[dc1] = "Test";
dt.Rows.Add(dr);
//Second DataTable
DataTable dt1 = new DataTable();
DataColumn dc2 = new DataColumn("ID");
DataColumn dc3 = new DataColumn("City");
dt1.Columns.AddRange(new DataColumn[] { dc2, dc3 });
DataRow dr1 = dt1.NewRow();
dr1[dc2] = "1";
dr1[dc3] = "Belgium";
dt1.Rows.Add(dr1);
//Rasult DataTable
DataTable result = new DataTable();
DataColumn col1 = new DataColumn("ID");
DataColumn col2 = new DataColumn("Name");
DataColumn col3 = new DataColumn("City");
result.Columns.AddRange(new DataColumn[] { col1, col2, col3 });
// Join both table data
var data = from row1 in dt.AsEnumerable()
join row2 in dt1.AsEnumerable()
on row1.Field<string>("ID") equals row2.Field<string>("ID") into test
from rw in test.DefaultIfEmpty()
select result.LoadDataRow(new object[]
{
row1.Field<string>("ID"),
row1.Field<string>("Name"),
rw == null ? "No City" : rw.Field<string>("City")
}, false);
data.CopyToDataTable();
答案 1 :(得分:0)
除了循环之外没有任何办法。 DataTables有一个合并函数,但它正在按行进行操作,即使你认为可以指定在需要时添加列,它会将其他列保留为null,你会得到这样的结果:
values values values null null
null null null values values
使用这种方法,您可以循环遍历所有行,并且步骤为2,您将在新DataTable中将两行合并为一行,但为此您还需要一个DataTable来存储结果。
如果您知道行数相同,则可以将列添加到列数较少的表中,然后将其复制到其中。
同样,我更喜欢循环。