在 C# 開發中,DataTable 是常用的記憶體資料結構。當資料表擁有大量欄位,但我們只需要其中幾個特定欄位時,如何高效提取?本文介紹兩種截然不同的策略,並補充五個實用的 DataTable 進階操作技巧。
最直觀的做法是遍歷並移除多餘欄位:
yourDataTable.Columns.Remove("ColumnName");
適用場景: 原始欄位不多,只需剔除 1~2 個欄位。若欄位數達幾十上百,逐一移除效率低且程式碼冗長。
DefaultView.ToTable 直接投影所需欄位(推薦)利用 DataView 的 ToTable 多載,一次指定要保留的欄位名稱陣列:
DataTable result = yourDataTable.DefaultView.ToTable(
false, // false = 保留重複列
new[] { "NeededColumn1", "NeededColumn2" } // 只保留這兩欄
);
優點: 程式碼簡潔、效能佳、語意清晰,無論原表有多少欄位都能一步到位。
避免 for 迴圈逐列判斷,改用 DataView.RowFilter:
DataView dv = new DataView(sourceTable,
"Age > 18", // 篩選條件
"Name ASC", // 排序
DataViewRowState.CurrentRows);
DataTable filtered = dv.ToTable();
同方法二,但可搭配篩選:
DataTable subset = sourceTable.DefaultView.ToTable(
false, new[] { "Id", "Name", "Email" });
destTable.Rows[i].ItemArray = srcTable.Rows[i].ItemArray;
DataTable copy = source.Copy();
copy.Columns["OldName"].ColumnName = "NewName";
SetOrdinalDataTable dt = new DataTable();
dt.Columns.Add("Col1");
dt.Columns.Add("Col2");
dt.Columns.Add("Col3");
dt.Rows.Add(1, 2, 3);
// 將 Col3 移至第 0 位
dt.Columns["Col3"].SetOrdinal(0);
Columns.Remove;大量欄位只取少數用 DefaultView.ToTable。DataView 進行篩選、排序、投影,避免手寫迴圈。Copy、ItemArray、SetOrdinal 等進階技巧,能大幅簡化資料表操作程式碼。