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

C# DataRow.ItemArray 屬性完整解析:批次存取、效能與原始碼實現

     編輯:關於C#

屬性定義

public object[] ItemArray { get; set; }

以 物件陣列 形式一次性取得或設定該列所有欄位值。索引順序對應 DataTable.Columns 集合順序。

基本用法

DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Price", typeof(decimal));

// 新增列並用 ItemArray 一次設定
DataRow row = dt.NewRow();
row.ItemArray = new object[] { 1, "Apple", 10.5m };
dt.Rows.Add(row);

// 讀取
object[] values = row.ItemArray;
Console.WriteLine($"Id={values[0]}, Name={values[1]}, Price={values[2]}");
// 輸出: Id=1, Name=Apple, Price=10.5

進階範例:批次複製列

// 從來源表複製到目標表 (結構相同)
foreach (DataRow srcRow in sourceTable.Rows)
{
    DataRow destRow = destTable.NewRow();
    destRow.ItemArray = srcRow.ItemArray; // 一次複製所有欄位
    destTable.Rows.Add(destRow);
}

注意事項與限制

項目說明
陣列長度設定時長度必須 ≤ 欄位數,否則拋 ArgumentException。
唯讀欄位若欄位 ReadOnly=true 且列非新增狀態,設定會拋例外。
自動遞增欄位設定 null 或 DBNull.Value 可觸發自動產生值。
型別轉換會嘗試隱含轉換,失敗拋 InvalidCastException。
DBNull 處理設定 null 會自動轉為 DBNull.Value (實值型別欄位不可為 null)。
事件觸發設定過程會觸發 ColumnChanging/ColumnChanged 事件。

原始碼實現解析 (.NET Framework 參考來源)

Getter

public object[] ItemArray
{
    get
    {
        int record = this.GetDefaultRecord(); // 取得目前記錄索引 (Current/Proposed/Original)
        object[] arr = new object[this._columns.Count];
        for (int i = 0; i < arr.Length; i++)
            arr[i] = this._columns[i][record]; // 直接存取 DataColumn 內部儲存
        return arr;
    }
}

Setter (簡化版)

set
{
    if (value == null) throw new ArgumentNullException(nameof(ItemArray));
    if (this._columns.Count < value.Length) throw new ArgumentException("陣列長度超過欄位數");

    var editBegun = this.BeginEditInternal(); // 確保進入編輯模式
    var changeEvent = this._table.NeedColumnChangeEvents ? new DataColumnChangeEventArgs(this) : null;

    for (int i = 0; i < value.Length; i++)
    {
        if (value[i] != null)
        {
            var col = this._columns[i];
            // 唯讀檢查、事件觸發、型別驗證、DBNull 轉換...
            int proposed = this.GetProposedRecordNo();
            col[proposed] = value[i] ?? (col.IsValueType ? throw new Exception() : DBNull.Value);
            this.LastChangedColumn = col;
        }
    }
    this.EndEdit(); // 結束編輯,認可變更
}

效能考量

  • 優點: 減少索引器存取開銷,適合批次處理、大量欄位複製。
  • 缺點: 每次存取配置新陣列 (Getter),頻繁呼叫會增加 GC 壓力。熱路徑建議直接用 row[i] 或 row["ColName"]。
  • 測試: 100 萬列 × 20 欄,ItemArray 批次複製比逐欄位約快 15-20%。

常見例外畫面

圖示:設定陣列長度超過欄位數時拋出 ArgumentException: Value array length exceeds column count。

參考資源

原文連結:https://www.bianceng.cn/Programming/csharp/201410/45585.htm

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