2017-05-16 35 views
0

我有一個DataTable對象,我需要根據存儲在列流中的數據來填充 - 即該流最初包含DataTable的模式,並且隨後應該按列組織數據。使用存儲在列上的數據填充C#DataTable的最快方法是什麼?

目前,我正在考慮的

  • 相當幼稚的方法創建足夠的空行持有所有數據值。
  • 爲每個單元格填充這些行。

結果是每個單元的迭代,這並不是特別快速地說。

即:

// Create rows first... 
// Then populate... 
foreach (var col in table.Columns.Cast<DataColumn>) 
{ 
    List<object> values = GetValuesfromStream(theStream); 

    // Actual method has some DBNull checking here, but should 
    // be immaterial to any solution. 
    for (var i=0; i<values.Count; i++) 
     table.Rows[i][col] = values[i]; 
} 

我的猜測是後盾DataStorage項目爲每列作爲添加的行沒有擴大,但作爲價值被添加到每一列,但我來自某些很遠。加載這種數據的任何提示。

NB首先加載所有清單,然後按行讀取可能不是明智的 - 這種做法正在採取減輕,往往串行巨大DataTable對象時,所以抓住一個導致潛在的內存不足異常首位整個數據網格的克隆並讀取它可能會將問題轉移到其他地方。原始表格和另一列值都有足夠的內存,但可能不會有DataTable的兩個副本。

+0

如果您正在調換,我看不到您可以避免需要逐個單元格工作/// –

+0

這就是爲什麼我現在每個單元都在運行 - 我只是希望有一條更快的路線隱藏在那裏。我的猜測是我需要訪問底層的DataStorage對象並直接複製到那裏的數組中,但是由於行帶有ID,這些ID實際上是針對這些數組的索引,所以我很難確定最好的方式那是。 – tobriand

+0

好吧,所以我想要解決這個問題的第一條評論是更好的創建一個'列表'每個表,填充它,然後*然後*將它添加到表中,而不是直接訪問'table.Rows'。這樣可以避免一些問題,其中列的值不能接受空值以及涉及表達式的問題。很多減速提示這個問題看起來像是重新計算表達式和DataTable事件模型。 – tobriand

回答

0

儘管我還沒有找到避免迭代單元格的方法,但根據上述註釋,我發現寫入DataRow已添加到表格中的項目結果是一個糟糕的主意,負責我觀察到的絕大多數減速。

我用最後的方法結束了看起來像這樣:

List<DataRow> rows = null; 
// Start population... 
var cols = table.Columns.Cast<DataColumn>.Where(c => string.IsNullOrEmpty(c.Expression)); 
foreach (var col in cols) 
{ 
    List<object> values = GetValuesfromStream(theStream); 
    // Create rows first if required. 
    if (rows == null) 
    { 
     rows = new List<DataRow>(); 
     for (var i=0; i<values.Count; i++) 
      rows.Add(table.NewRow()); 
    } 
    // Actual method has some DBNull checking here, but should 
    // be immaterial to any solution. 
    for (var i=0; i<values.Count; i++) 
     rows[i][col] = values[i]; 
} 
rows.ForEach(r => table.Rows.Add(r)); 

這種方法解決了兩個問題:

  1. 如果您嘗試空DataRow添加到具有空值的表限制或類似的,那麼你會得到一個錯誤。這種方法可以確保所有數據在添加之前都存在,這可以解決大多數此類問題(儘管我不需要檢查自動遞增PK列的工作原理)。
  2. 在涉及表達式的情況下,在行狀態更改爲已添加到表中的行時評估這些表達式。因此,在每次向單元格添加值(昂貴且毫無意義)時重新計算所有表達式的位置之前,現在所有計算都是在所有基本數據添加完畢後才發生。

當然,寫入表格可能還有其他複雜性,因爲我使用的表格不使用DataTable類別/模型的那些功能。但對於簡單的情況,這很好。

相關問題