首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

ASP.NET DataTable 動態保留指定欄位實作技巧

     編輯:ASP.NET 基礎

需求情境

動態產生的 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);

關鍵優化點

  • HashSet O(1) 查找:替代雙層迴圈,效能從 O(n×m) 降為 O(n)
  • 反向迴圈:移除欄位後,前方索引不變,避免 i++ 導致的邏輯錯誤
  • RemoveAt:直接依索引移除,免再次搜尋名稱
  • 忽略大小寫:實務上欄位名大小寫常不一致,建立 HashSet 時指定 OrdinalIgnoreCase

擴充:保留欄位並重新排序

public 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/報表時極為實用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved