A HashSet<T>
реализует интерфейс ICollection<T>
:
public interface ICollection<T> : IEnumerable<T>, IEnumerable
{
// Methods
void Add(T item);
void Clear();
bool Contains(T item);
void CopyTo(T[] array, int arrayIndex);
bool Remove(T item);
// Properties
int Count { get; }
bool IsReadOnly { get; }
}
A List<T>
реализует IList<T>
, что расширяет ICollection<T>
public interface IList<T> : ICollection<T>
{
// Methods
int IndexOf(T item);
void Insert(int index, T item);
void RemoveAt(int index);
// Properties
T this[int index] { get; set; }
}
HashSet установил семантику, реализованную через внутреннюю хеш-таблицу:
Набор - это коллекция, которая не содержит
дубликаты элементов и чьи элементы
в произвольном порядке.
Что получает HashSet, если он теряет поведение индекса / позиции / списка?
Добавление и извлечение элементов из HashSet всегда выполняется самим объектом, а не с помощью индексатора, и близко к операции O (1) (List - O (1) add, O (1) - по индексу, O ( n) найти / удалить).
Поведение HashSet можно сравнить с использованием Dictionary<TKey,TValue>
, только добавляя / удаляя ключи в качестве значений и игнорируя сами значения словаря. Можно ожидать, что ключи в словаре не будут иметь повторяющихся значений, и в этом суть части «Установить».