開発環境:.NET 4.0以上
注: .NET Framework 4内のSystem.Collections.Concurrent名前空間。 MSDNドキュメントと同様に、ConcurrentDictionaryは複数のスレッドが同時にアクセスできるスレッドセーフコレクションを実装しています。 ConcurrentDictionaryはIDictionary<TKey、TValue>を実装しており、キー/値の追加や更新のための独自の仕組みを持っています。 (以下は、いつ、どのような方法を使うべきかの説明です)
シナリオ1:新しい項目を追加する場合、そのキーが辞書に存在しない場合のみ... TryAddを使ってください。 TryAddはキーと辞書に加えた値を受け入れ、キーが辞書に存在しない場合はfasleを返します。 存在すればtrueを返します。 public bool TryAdd(TKey key, TValue value)
状況2:辞書の既存のキーを更新する... TryUpdateを使ってください。 辞書にこのキーがあり条件付き更新を提供すれば、このメソッド内で比較値が現在の値と同等になった場合に更新可能な比較値を提供すべきです(TValue comparisonValue)。 public bool TryUpdate(TKey key, TValue newValue, TValue comparisonValue)
状況3:キー/値が辞書に追加される必要がある; キーが辞書に存在するか確信が持てない場合は、 もし存在するなら、更新してください。存在しなければ、追加してください...
AddOrUpdateを使ってください。 AddOrUpdateには2つのオーバーロードがあり、それぞれの値が返されます: 最初のオーバーロードパラメータはAddOrUpdate(TKey, Func<TKey, TValue>, Func<TKey, TValue, TValue>) パラメータはキーと2つの代理です; 最初の代理の目的は、キーが存在しない場合に委任し、値(初期値)を返すことです。この委任ファンクは初期値キー<返します>。 第2の代理 Func < は Value、key、oldValue> を返し、キーが辞書に存在しない場合に最初の代理を実行します(存在すれば実行されません; 目的は値に初期値を与えることであり、その後値(値の初期値)を返します。 2つ目の委任は値の価値を変更する方法であり、これも戻る値(初期値を最終値に変更)を必要とします。 Func < は > Value、key、oldValue を返します。 public TValue AddOrUpdate(TKey、Func<TKey、TValue>、Func<TKey、TValue、TValue>)
2. 2回目のオーバーロードのパラメータはAddOrUpdate(TKey, TValue, Func<TKey, TValue, TValue>)です。 最初のパラメータはキー、2番目はキーが存在しないときのもので、この値は値の初期値、3番目は変更を実行するための代理(Func<はValue、key、oldValue>を返します。 public TValue AddOrUpdate(TKey, TValue, Func<TKey, TValue, TValue>)
状況4:キーの値を辞書に追加しますが、キーがすでに存在する場合は値を削除します。 そうでなければ、追加されます 最初のオーバーロード:GetOrAdd(TKEY, Func<TKey, TValue>valueFactory) 最初のパラメータはキー、2番目のパラメータは委任されたFunc<value, key>です。キーが存在しない場合は、変数がキーとして渡され、その値が変更されます。 鍵と値を作成し、値を返します。
2. 第二オーバーロード:GetOrAdd(TKEY、TValue) 最初のパラメータはキーであり、2つ目のパラメータの目的はキーが存在しない場合にそのキーによって与えられる新しい値を作成することです。 リターン価値。 public TValue GetOrAdd(TKEY,Func<TKey, TValue>valueFactory) public TValue GetOrAdd(TKEY,TValue)
AddOrUpdateとGetOrAddの各操作は、ConcurrentDictionaryが辞書への修正・書き込みを行うためのメソッドであり、スレッドの安全性を確保しています(ロックレスで行い、辞書内のデータを読み込みます)。 |