我有一個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
的兩個副本。
如果您正在調換,我看不到您可以避免需要逐個單元格工作/// –
這就是爲什麼我現在每個單元都在運行 - 我只是希望有一條更快的路線隱藏在那裏。我的猜測是我需要訪問底層的DataStorage對象並直接複製到那裏的數組中,但是由於行帶有ID,這些ID實際上是針對這些數組的索引,所以我很難確定最好的方式那是。 – tobriand
好吧,所以我想要解決這個問題的第一條評論是更好的創建一個'列表'每個表,填充它,然後*然後*將它添加到表中,而不是直接訪問'table.Rows'。這樣可以避免一些問題,其中列的值不能接受空值以及涉及表達式的問題。很多減速提示這個問題看起來像是重新計算表達式和DataTable事件模型。 –
tobriand