List.Add vs HashSet.Add для небольших коллекций в c #

1

Данный

HashSet<T> set;
List<T> list;
T t;

Какая из них лучше подходит для небольших коллекций?

if (! list.Contains (t)) list.Add (t);

Или

set.Add (t);

Источник сомнений: производительность HashSet и списков

  • 1
    Почему бы не попробовать, если это важно?
  • 0
    какое у вас определение маленького?
Теги:
performance
list
set

2 ответа

1

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();
1

Это действительно связано с тем, как вы собираетесь использовать структуры данных. Если вам нужен доступ к элементу с помощью индекса, вы не можете использовать HashSet, также если вам нужно хранить дубликаты, вы можете использовать HashSet. Список обычно используется для большинства операций, поэтому я не понимаю базовый дизайн и функциональность HashSet, тогда вероятность того, что список будет достаточным. Изображение 174551

  • 1
    Согласно MSDN List.Add () и HashSet.Add () оба имеют значение O (1), если число меньше емкости внутреннего массива, и O (n), если размер объекта необходимо изменить.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню