0

ConcurrentDictionary で値を更新するエレガントな方法を見つけようとしています。以下に、達成しようとしていることの簡単な例を作成しました。

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 }
};

したがって、上記の例では、dataLookup ConcurrentDictionary の ValueProperty を 1、3、5 の ID でそれぞれ 111、222、333 に設定したいと考えています。newDataReceived オブジェクトを好きなように変更できますが、concurrentDictionary としての dataLookup にかなりこだわっています。

現時点では、リストを反復処理していますが、LINQ を使用してこのタスクをより効率的にするための提案を探しています。

4

3 に答える 3

2

入ってくるのが本当に単なる更新である場合は、別のものを使用できますForEach:

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

個人的には、単純な foreach ループでこれを表現します。

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

上記には、アイテムが実際に並行辞書に含まれているかどうかのチェックがないことに注意してください。それが保証されていない場合 (更新ではない場合)、このチェックを追加する必要があります。

于 2012-06-19T21:33:25.357 に答える
0

Linqはクエリ用であり、更新用ではありません。新しい辞書を作成できた場合は、LinqのToDictionary()メソッドを使用することで可能になりますが、追加するメソッドを呼び出す必要があるため、多かれ少なかれforeachループに追いやられます。

また、Linqは何も効率的にすることはなく、コードをより自然に見せます。

于 2012-06-19T21:29:21.683 に答える