Trước tiên, bạn có thể tạo các bảng điểm đến, thêm đó là cột (bằng cách tổng hợp số lượng cột trong tất cả các bảng đầu vào) và sau đó thêm nó các hàng bằng cách ghép các mảng riêng lẻ của các giá trị cho mỗi hàng trong các bảng đầu vào.
Tất nhiên, các hàng trong kết quả DataTable
sẽ chứa các giá trị khi chúng xuất hiện theo hướng từ trên xuống cho mỗi bảng đầu vào (căn chỉnh trên đầu). Nó cũng có nghĩa là số hàng kết quả là số hàng trong bảng đầu vào lớn nhất.
Đầu tiên chúng tôi sẽ khởi tạo và cư một biến List<DataTable>
, sau đó chúng tôi sẽ thực hiện việc tham gia, sử dụng biến này như một tham số phương pháp:
#region table collection initialization
List<DataTable> dts = new List<DataTable>();
var dt = new DataTable();
dt.Columns.Add("Test0", typeof(string));
dt.Rows.Add(1);
dt.Rows.Add(2);
dts.Add(dt);
dt = new DataTable();
dt.Columns.Add("Test1", typeof(int));
dt.Rows.Add(2);
dts.Add(dt);
dt = new DataTable();
dt.Columns.Add("Test3", typeof(int));
dt.Columns.Add("Test4");
dt.Columns.Add("Test5", typeof(int));
dt.Rows.Add(3, "a", 1);
dt.Rows.Add(4);
dt.Rows.Add(5, "a");
dt.Rows.Add(null, "a");
dts.Add(dt);
dt = new DataTable();
dt.Columns.Add("Test6", typeof(DateTime));
dt.Columns.Add("Test7", typeof(int));
dt.Rows.Add(DateTime.Now);
dts.Add(dt);
#endregion
// sample method usage
var result = GetJoinedTable(dts);
Hãy tạo GetJoinedTable
phương pháp đó sẽ trở lại vào biến result
bảng kết quả được kết hợp:
private DataTable GetJoinedTable(List<DataTable> dts)
{
var dest = new DataTable();
//will be used if you have non-unique column names
int counter = 0;
foreach (var column in dts
.SelectMany<DataTable, DataColumn>(t =>
t.Columns.Cast<DataColumn>()))
{
dest.Columns.Add(column.ColumnName, column.DataType);
// if you have non-unique column names use the following instead
//dest.Columns.Add(String.Format("column_{0}", counter++),
// column.DataType);
}
List<object> rowItems;
for (int i = 0; i < dts.Max(t => t.Rows.Count); i++)
{
rowItems = new List<object>();
for (int j = 0; j < dts.Count; j++)
{
if (dts[j].Rows.Count > i)
{
var r = dts[j].Rows[i].ItemArray
.Select((v, index) =>
(v == null || v == System.DBNull.Value)
? GetDefault(dts[j].Columns[index].DataType) : v);
rowItems.AddRange(r);
}
else
{
for (int c = 0; c < dts[j].Columns.Count; c++)
{
rowItems.Add(GetDefault(dts[j].Columns[c].DataType));
}
}
}
dest.Rows.Add(rowItems.ToArray());
}
return dest;
}
Bạn cũng sẽ cần thêm phương thức sau, trả về giá trị cột mặc định thích hợp, dựa trên thuộc tính DataType
của cột:
object GetDefault(Type t)
{
if (t.IsValueType)
{
return Activator.CreateInstance(t);
}
else
{
return null;
}
}
Tại sao không chỉ lặp qua các hàng trong bảng nguồn và cho mỗi hàng, hãy thêm các cột thích hợp vào bảng mục tiêu thích hợp? Các hàng và các cột (trong mỗi hàng) có thể được lặp lại. Nó sẽ là tầm thường để tạo ra một Map of Functions từ SourceTable/row-> TargetTable/row. – user2246674