A HashSet<T>
met en œuvre la ICollection<T>
interface :
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>
met en œuvre IList<T>
qui étend le 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; }
}
Un HashSet a une sémantique d'ensemble, implémentée via une table de hachage en interne :
Un ensemble est une collection qui ne contient pas éléments en double, et dont les éléments ne sont pas dans un ordre particulier.
Qu'est-ce que le HashSet gagne, s'il perd le comportement index/position/liste ?
L'ajout et la récupération d'éléments dans le HashSet se fait toujours par l'objet lui-même, sans passer par un indexeur, et est proche d'une opération O(1) (List est O(1) add, O(1) retrieve by index, O(n) find/remove).
Le comportement d'un HashSet peut être comparé à l'utilisation d'un fichier de type Dictionary<TKey,TValue>
en ajoutant/supprimant uniquement les clés en tant que valeurs, et en ignorant les valeurs du dictionnaire elles-mêmes. On s'attendrait à ce que les clés d'un dictionnaire n'aient pas de valeurs en double, et c'est le but de la partie "Set".