Я создаю собственную коллекцию, которая инкапсулирует ConcurrentDictionary. Я нашел много информации об инкапсуляции/наследовании из общей коллекции, но ничего конкретного для параллельных коллекций. Вот фрагмент кода моего базового примера, за которым следуют некоторые общие вопросы.Наследование/инкапсуляция параллельной коллекции C#
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>
, и если да, то каковы некоторые рекомендации, похожие на this для наследования от несовпадающих коллекций. - Как вы реализуете методы пересылки для таких методов, как Select? Я попробовал ряд изменений, как следующее, но не может заставить его работать:
public IEnumerable<TResult> Select<ItemCollection, TResult>(this ItemCollection source, Func<KeyValuePair<string, Item>, TResult> selector) { return Collection.Select(selector); }
Если я наследовать ConcurrentDictionary это приводит к реализации как
Проверить [Переопределение методов расширения LINQ] (http://stackoverflow.com/questions/2705864/overriding-linq-extension-methods) – sll