2017-01-18 34 views
0

添加相同的價值觀我有以下的DataTable.NET 4.0中的所有行一列DataTable中

DataTable dt = new dataTable(); 

我有這個dataTable的一些其他方法填補。在執行以下語句之前,它將有50000行和40列。

行數和列數可能有所不同。因此我沒有爲dataTable定義特定的一組列。

我想在結尾添加兩列(guid和addeddate),並且希望爲這兩列的所有50K行添加相同的值。

我已經寫了這個簡單的foreach循環。有沒有什麼辦法可以並行?

我試過使用Parallel.Foreach,但沒有得到任何成功。

//by this time my dt will have 50000 rows and 40 columns 

dt.Columns.Add(new DataColumn("guid", typeof(string))); 
dt.Columns.Add(new DataColumn("addeddate", typeof(DateTime))); 
string sessionIDValue = Convert.ToString(Guid.NewGuid()); 
DateTime todayDt = DateTime.Today;     


foreach (DataRow row in dt.Rows) 
{ 
    row["guid"] = sessionIDValue; 
    row["addeddate"] = todayDt;  
} 
+0

你已經嘗試指定'DefaultValue'爲您添加的DataColumns?我不敢預測它的表現如何(如果它甚至有效的話)。 – Filburt

+0

@Filburt是的,但由於DataTable的結構不固定,所以我們不能提供這個 – captainsac

回答

2

您需要使用顯式索引訪問行,並且行索引將是完成此操作的完美方式。

您應該可以創建一個數組,它等於您擁有的行數(例如50000),並將每行的索引作爲該數組的值(例如0..1..2..3 ..等等),然後在該索引數組上使用並行循環,從而將顯式行索引傳遞給dt.Rows對象。

代碼的要點是:

// Pseudo code 

// Create array equal to size of the # of rows (int ArrayOfIndexes[]) 
// Fill that array with values representing row indexes starting at 0 

Parallel.ForEach(ArrayOfIndexes, (index) => 
{ 
    lock(dt) 
    { 
     dt.Rows[index]["guid"] = sessionIDValue; 
     dt.Rows[index]["addeddate"] = todayDt; 
    } 
} 

編輯:我沒有發現,因爲數據表不是線程安全的,也就是說你必須包括在你的任務,鎖定這顯然會產生性能上的衝擊,但應該比沒有使用Parallel.ForEach循環更快。

+0

我認爲在這裏使用鎖是沒有意義的。即使你想這樣做,最好的做法是有一個單獨的lockObject。 +1 for Parallel.ForEach –

+0

「鎖定」是爲了防止在DataTable不是線程安全的情況下在行值分配過程中出現間歇性錯誤。同意你的看法,單獨的鎖定對象是個好主意......我基本上只是給出解決方案的「本質」,而不是確切的解決方案。 :) –

0

@Shane Oborn的答案沒有額外的ArrayOfIndexes變量,並使用單獨的鎖對象進行升級。

我會用:

var lockObj = new object(); 
Parallel.Foreach(dt.AsEnumerable(), row => 
{ 
    lock(lockObj) 
    { 
     row["guid"] = sessionIDValue; 
     row["addeddate"] = todayDt;  
    } 
}); 

你必須添加using語句:

using System.Data.DataSetExtensions; 
using System.Linq; 
using System.Xml; 
+0

這不是真正的安東。正如我上面提到的那樣,如果你使用你在這裏的東西,然後在一個5000字節的數組上進行嘗試,你會發現由於DataTable不是線程安全的,你會得到「索引」錯誤。 –

+0

我測試過了,你是對的,似乎不可能在沒有鎖的情況下並行編輯DataTable。鎖在這種情況下消除了並行的所有好處... –

+0

正確的,如果上面的代碼最終是所有使用的,那麼將沒有好處。但是,如果還有其他事情可能在鎖定之外,顯然在這種情況下會產生一些好處,但僅與在鎖定之外完成的工作量有關。 –