Данный
HashSet<T> set;
List<T> list;
T t;
Какая из них лучше подходит для небольших коллекций?
if (! list.Contains (t)) list.Add (t);
Или
set.Add (t);
Источник сомнений: производительность HashSet и списков
HashSet следует использовать в случае, если вы заботитесь о производительности (особенно, если вы знаете, что будете работать с большим набором элементов), но не заботятся о заказе.
Используйте List, если вы хотите итерации по коллекции. Итерация через все элементы в списке обычно намного быстрее, чем через набор (если вы не используете внутри таких методов, как Содержит).
Проверьте этот образец для проверки производительности:
const int COUNT = 100000;
HashSet<int> hashSetOfInts = new HashSet<int>();
Stopwatch stopWatch = new Stopwatch();
for (int i = 0; i < COUNT; i++)
{
hashSetOfInts.Add(i);
}
stopWatch.Start();
for (int i = 0; i < COUNT; i++)
{
hashSetOfInts.Contains(i);
}
stopWatch.Stop();
Console.WriteLine(stopWatch.Elapsed);
stopWatch.Reset();
List<int> listOfInts = new List<int>();
for (int i = 0; i < COUNT; i++)
{
listOfInts.Add(i);
}
stopWatch.Start();
for (int i = 0; i < COUNT; i++)
{
listOfInts.Contains(i);
}
stopWatch.Stop();
Console.WriteLine(stopWatch.Elapsed);
Console.Read();
Это действительно связано с тем, как вы собираетесь использовать структуры данных. Если вам нужен доступ к элементу с помощью индекса, вы не можете использовать HashSet, также если вам нужно хранить дубликаты, вы можете использовать HashSet. Список обычно используется для большинства операций, поэтому я не понимаю базовый дизайн и функциональность HashSet, тогда вероятность того, что список будет достаточным.