2012-06-19 58 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不会使任何东西效率更高,它只是使代码看起来更自然。