動態產生的 DataTable 欄位不固定,需依業務規則僅保留特定欄位(如 "X", "XX", "XXX" 等),移除其餘欄位。
public DataTable KeepColumns(DataTable dt, string[] keepColumns) {
var keepSet = new HashSet<string>(keepColumns, StringComparer.OrdinalIgnoreCase);
// 關鍵:從後往前刪除,避免索引位移導致漏刪或越界
for (int i = dt.Columns.Count - 1; i >= 0; i--) {
if (!keepSet.Contains(dt.Columns[i].ColumnName)) {
dt.Columns.RemoveAt(i); // RemoveAt 比 Remove(name) 更高效
}
}
return dt;
}
// 呼叫範例
string[] keep = { "X", "XX", "XXX", "XXXX", "XXXXX" };
DataTable result = KeepColumns(originalDt, keep);
i++ 導致的邏輯錯誤OrdinalIgnoreCasepublic DataTable ReorderAndKeep(DataTable dt, string[] columnOrder) {
var result = dt.Clone(); // 複製結構不複製資料
foreach (string col in columnOrder) {
if (dt.Columns.Contains(col)) result.Columns.Add(col, dt.Columns[col].DataType);
}
// 複製資料
foreach (DataRow row in dt.Rows) {
var newRow = result.NewRow();
foreach (string col in columnOrder) {
if (dt.Columns.Contains(col)) newRow[col] = row[col];
}
result.Rows.Add(newRow);
}
return result;
}
此法可同時達成「只保留需要欄位」與「指定欄位順序」,匯出 Excel/報表時極為實用。