2012-06-19 155 views
0

我試圖找到一種更新ConcurrentDictionary中的值的優雅方式。我創建的什麼,我想下面來實現一個簡單的例子:LINQ從另一個列表更新一個列表

ConcurrentDictionary<int, MyDataClass> dataLookup = new ConcurrentDictionary<int, MyDataClass>(); 

// Initialise the example dataLookup with some dummy data 
new List<MyDataClass> 
{ 
    new MyDataClass { Id = 1, ValueProperty = 0 }, 
    new MyDataClass { Id = 2, ValueProperty = 0 }, 
    new MyDataClass { Id = 3, ValueProperty = 0 }, 
    new MyDataClass { Id = 4, ValueProperty = 0 }, 
    new MyDataClass { Id = 5, ValueProperty = 0 }    
}.ForEach(myClass => dataLookup.TryAdd (myClass.Id, myClass)); 

// incoming results that need to be fed into the above dataLookup 
List<MyDataClass> newDataReceived = new List<MyDataClass> 
{ 
    new MyDataClass { Id = 1, ValueProperty = 111 }, 
    new MyDataClass { Id = 3, ValueProperty = 222 }, 
    new MyDataClass { Id = 5, ValueProperty = 333 } 
}; 

所以在上面的例子中,我想設置ValueProperty在dataLookup ConcurrentDictionary與1的內徑,3 & 5至111 ,222和333。我可以將newDataReceived對象更改爲我想要的任何東西,但我幾乎堅持將dataLookup作爲ConcurrentDictionary。

目前我正在遍歷列表,但我正在尋找一些關於使用LINQ來提高此任務的建議。

回答

2

如果它真的只是更新被進來的,你可以只使用另一ForEach

newDataReceived.ForEach(x => dataLookup[x.Id].ValueProperty = x.ValueProperty); 

個人而言,我只想用一個簡單的foreach循環表達這個雖然:

foreach(var update in newDataReceived) 
    dataLookup[update.Id].ValueProperty = update.ValueProperty; 

請注意,上面缺少一個檢查項是否實際包含在併發字典中 - 如果不能保證(這不是更新),您將不得不添加此檢查。

0

Linq用於查詢,而不是更新。如果你能夠創建一個新字典,可以使用Linq的ToDictionary()方法,但是由於你必須調用一個方法來添加,所以你或多或少地被降級爲一個foreach循環。

此外,Linq不會使任何東西效率更高,它只是使代碼看起來更自然。

相關問題