2014-05-18 136 views
0

假設我們有一個有100列和100行的DataTable。 我們有值的這樣一個包含100個成員的字典:更新數據表的最快方法

Dictionary<int, string> dictionary = GetValues(); 

在上述辭典鍵是數據表的索引和字典的值就是我們要DataTable中更新目標值。

更新Datatable的最快方法是什麼?我用這種方式,但它很慢:

 foreach (var pair in dictionary) 
     { 

      timeTable.Rows[pair.Key].SetField(columnIndex, pair.Value); 
     } 

假設我們必須更新40列的所有行,它沒有良好的性能。我在想Datatable就像是一個矩陣,當你想在Matrix上更新一個單元格時,如果你有行和列的索引,它應該不需要時間。

+0

你是什麼意思的「慢」?有什麼措施?另外它是需要時間的「GetValues()」方法,還是僅用於foreach本身? – quantdev

+1

100x100在數據方面很小。 – TomTom

回答

1

DataTable是一個非常昂貴的結構,在後臺做很多事情(特別是因爲它們被設計爲處理任何事情)。

如果性能是關鍵的考慮:

  • 創建自己的結構,如類封裝的字符串數組的數組(例如字符串矩陣,在其訪問會非常快)

  • 並行更新表(因爲你永遠不會訪問同一行),因爲知道DataTable對寫操作不是線程安全的。

例如,

// Probably not thread safe, after the MSDN documentation 
Parallel.ForEach(Dictionary, pair => 
    { 
     timeTable.Rows[pair.Key].SetField(columnIndex, pair.Value); 
    }); 

編輯:這不會在一般的情況下工作(即使在不同的行寫操作可能會影響DataTable的全局狀態,所以我建議你去用自己的結構,如果性能是至關重要的,如果你不需要DataTable的特定功能)

+0

謝謝卡里姆,請您提供關於並行更新的示例嗎? – Shahin

+0

這是正確的,它會引發異常,實際上,因爲我已將DataTable綁定到DataGrid我不能使用任何其他結構,以及我意識到綁定到DataGrid的對象列表的可能性,但在我的場景中,用戶可能會生成額外的列運行時間,這就是爲什麼我使用DataTable – Shahin

相關問題