ConcurrentDictionary をカプセル化するカスタム コレクションを作成しています。一般的なコレクションからのカプセル化/継承に関する多くの情報を見つけましたが、並行コレクションに固有のものは何も見つかりませんでした。これは私の基本ケースのコード スニペットであり、その後にいくつかの一般的な質問が続きます。
class ItemCollection
{
private ConcurrentDictionary<string, Item> Collection;
public ItemCollection() { Collection = new ConcurrentDictionary<string, Item>(); }
public bool TryAdd(string webId, string name) { return Collection.TryAdd(webId, new Item(name)); }
public bool TryAdd(string webId, Item item) { return Collection.TryAdd(webId, item); }
public bool TryUpdate(KeyValuePair<string, Item> entry, Data data)
{
Item newItem = entry.Value;
newItem.AddData(data);
return Collection.TryUpdate(entry.Key, newItem, entry.Value);
}
}
- この方法で並行コレクションをカプセル化することは許容されますか? それとも、ジェネリック コレクションから独自のスレッド セーフ コレクションを作成する領域に移行するのでしょうか?
- カスタム コレクションはスレッドセーフですか?
- 並行コレクションの継承は受け入れられますか? そうであれば、非並行コレクションから継承するためのこれ
class ItemCollection : ConcurrentDictionary<string, Item>
に似た、いくつかのガイドラインは何ですか。 - Select のようなメソッドの転送メソッドをどのように実装しますか? 次のような一連のバリエーションを試しましたが、機能しません。
public IEnumerable<TResult> Select<ItemCollection, TResult>(this ItemCollection source, Func<KeyValuePair<string, Item>, TResult> selector) { return Collection.Select(selector); }
ConcurrentDictionary を継承すると、次のような実装になります