3 回答

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超4個(gè)贊
如果允許使用LINQ,請(qǐng)查看以下示例。它創(chuàng)建兩個(gè)帶有整數(shù)列的DataTables,用一些記錄填充它們,使用LINQ查詢(xún)連接它們并將它們輸出到Console。
DataTable dt1 = new DataTable();
dt1.Columns.Add("CustID", typeof(int));
dt1.Columns.Add("ColX", typeof(int));
dt1.Columns.Add("ColY", typeof(int));
DataTable dt2 = new DataTable();
dt2.Columns.Add("CustID", typeof(int));
dt2.Columns.Add("ColZ", typeof(int));
for (int i = 1; i <= 5; i++)
{
DataRow row = dt1.NewRow();
row["CustID"] = i;
row["ColX"] = 10 + i;
row["ColY"] = 20 + i;
dt1.Rows.Add(row);
row = dt2.NewRow();
row["CustID"] = i;
row["ColZ"] = 30 + i;
dt2.Rows.Add(row);
}
var results = from table1 in dt1.AsEnumerable()
join table2 in dt2.AsEnumerable() on (int)table1["CustID"] equals (int)table2["CustID"]
select new
{
CustID = (int)table1["CustID"],
ColX = (int)table1["ColX"],
ColY = (int)table1["ColY"],
ColZ = (int)table2["ColZ"]
};
foreach (var item in results)
{
Console.WriteLine(String.Format("ID = {0}, ColX = {1}, ColY = {2}, ColZ = {3}", item.CustID, item.ColX, item.ColY, item.ColZ));
}
Console.ReadLine();
// Output:
// ID = 1, ColX = 11, ColY = 21, ColZ = 31
// ID = 2, ColX = 12, ColY = 22, ColZ = 32
// ID = 3, ColX = 13, ColY = 23, ColZ = 33
// ID = 4, ColX = 14, ColY = 24, ColZ = 34
// ID = 5, ColX = 15, ColY = 25, ColZ = 35

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超10個(gè)贊
我想要一個(gè)連接表的函數(shù),而不需要使用匿名類(lèi)型選擇器定義列,但很難找到任何。我最終不得不自己做。希望這將有助于將來(lái)搜索此內(nèi)容的任何人:
private DataTable JoinDataTables(DataTable t1, DataTable t2, params Func<DataRow, DataRow, bool>[] joinOn){ DataTable result = new DataTable(); foreach (DataColumn col in t1.Columns) { if (result.Columns[col.ColumnName] == null) result.Columns.Add(col.ColumnName, col.DataType); } foreach (DataColumn col in t2.Columns) { if (result.Columns[col.ColumnName] == null) result.Columns.Add(col.ColumnName, col.DataType); } foreach (DataRow row1 in t1.Rows) { var joinRows = t2.AsEnumerable().Where(row2 => { foreach (var parameter in joinOn) { if (!parameter(row1, row2)) return false; } return true; }); foreach (DataRow fromRow in joinRows) { DataRow insertRow = result.NewRow(); foreach (DataColumn col1 in t1.Columns) { insertRow[col1.ColumnName] = row1[col1.ColumnName]; } foreach (DataColumn col2 in t2.Columns) { insertRow[col2.ColumnName] = fromRow[col2.ColumnName]; } result.Rows.Add(insertRow); } } return result;}
您可以如何使用此示例:
var test = JoinDataTables(transactionInfo, transactionItems, (row1, row2) => row1.Field<int>("TransactionID") == row2.Field<int>("TransactionID"));
一個(gè)警告:這當(dāng)然沒(méi)有優(yōu)化,所以在獲得超過(guò)20k的行數(shù)時(shí)要小心。如果您知道一個(gè)表將比另一個(gè)表大,請(qǐng)嘗試將較小的表放在第一個(gè),將較大的表放在第二個(gè)表中。

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超3個(gè)贊
這是我的代碼。不完美,但工作得很好。我希望它對(duì)某人有所幫助:
static System.Data.DataTable DtTbl (System.Data.DataTable[] dtToJoin) { System.Data.DataTable dtJoined = new System.Data.DataTable(); foreach (System.Data.DataColumn dc in dtToJoin[0].Columns) dtJoined.Columns.Add(dc.ColumnName); foreach (System.Data.DataTable dt in dtToJoin) foreach (System.Data.DataRow dr1 in dt.Rows) { System.Data.DataRow dr = dtJoined.NewRow(); foreach (System.Data.DataColumn dc in dtToJoin[0].Columns) dr[dc.ColumnName] = dr1[dc.ColumnName]; dtJoined.Rows.Add(dr); } return dtJoined; }
- 3 回答
- 0 關(guān)注
- 813 瀏覽
添加回答
舉報(bào)