Вот особенно гибкий подход:
public abstract class UniqueSet<T, TDictionary> : ICollection<T>
where TDictionary : IDictionary<T, byte> {
protected TDictionary _internalDictionary;
protected UniqueSet(TDictionary dictionary) {
_internalDictionary = dictionary;
}
// implement the ICollection<T> interface
// using your internal dictionary's Keys property
// for example:
public void Add(T value) {
_internalDictionary.Add(value, 0);
}
// etc.
}
public class UniqueSet<T> : UniqueSet<T, Dictionary<T, byte>> {
public UniqueSet() : base(new Dictionary<T, byte>()) { }
}
Почему абстрактный базовый класс, спросите вы? Ну, с этим подходом вы могли бы также реализовать, например, SortedUniqueSet<T>
с SortedList<T, byte>
в качестве его внутренней коллекции (и это могло бы реализовать IList<T>
) - без необходимости писать практически больше кода. Вы также можете использовать любые другие причудливые реализации IDictionary<TKey, TValue>
, которые вы когда-либо находили (если бы вы выбрали).