三個數據庫查詢得到結構相同的三張表(A庫、B庫、C庫),字段:time, id, err。需合併為一張匯總表:time, id, errA, errB, errC,三表按 time + id 一一對應。
using System;
using System.Data;
public DataTable MergeThreeTables(DataTable dtA, DataTable dtB, DataTable dtC) {
DataTable result = new DataTable("Merged");
result.Columns.Add("Time", typeof(string));
result.Columns.Add("ID", typeof(int));
result.Columns.Add("ErrA", typeof(int));
result.Columns.Add("ErrB", typeof(int));
result.Columns.Add("ErrC", typeof(int));
// 建立 B、C 表的索引字典,鍵:time#id,值:err,提升查找性能
var dictB = dtB.AsEnumerable()
.ToDictionary(r => $"{r["time"]}#{r["id"]}", r => Convert.ToInt32(r["err"]));
var dictC = dtC.AsEnumerable()
.ToDictionary(r => $"{r["time"]}#{r["id"]}", r => Convert.ToInt32(r["err"]));
foreach (DataRow rowA in dtA.Rows) {
string time = rowA["time"].ToString();
int id = Convert.ToInt32(rowA["id"]);
int errA = Convert.ToInt32(rowA["err"]);
string key = $"{time}#{id}";
int errB = dictB.TryGetValue(key, out var vB) ? vB : 0;
int errC = dictC.TryGetValue(key, out var vC) ? vC : 0;
result.Rows.Add(time, id, errA, errB, errC);
}
return result;
}
// 在合併循環內直接計算,或後續遍歷 result
foreach (DataRow row in result.Rows) {
double avg = (Convert.ToDouble(row["ErrA"]) +
Convert.ToDouble(row["ErrB"]) +
Convert.ToDouble(row["ErrC"])) / 3.0;
// 可新增列存儲
// row["AvgErr"] = Math.Round(avg, 2);
}
或用 LINQ 一行生成平均列:
result.Columns.Add("AvgErr", typeof(double));
foreach (DataRow row in result.Rows) {
row["AvgErr"] = new[] { row.Field<int>("ErrA"), row.Field<int>("ErrB"), row.Field<int>("ErrC") }.Average();
}
多源表合併核心是建立高效索引(字典/哈希),以基準表驅動查找。C# `DataTable` 配合 LINQ/Dictionary 代碼簡潔高效,注意類型轉換與空值處理即可。