Я читал, что перебирать HashSet - плохая практика.Должен ли я сначала вызывать .ToList ()? - PullRequest
6 голосов
/ 02 ноября 2011

У меня есть коллекция предметов под названием RegisteredItems. Меня не волнует порядок элементов в RegisteredItems, только то, что они существуют.

Я выполняю два типа операций с RegisteredItems:

  • Найти и вернуть товар по имуществу.
  • Перебор коллекции и побочный эффект.

Согласно: Когда мне следует использовать тип HashSet ? Роберт Р. говорит:

"Перебирать HashSet несколько опасно, потому что накладывает порядок на предметы в наборе. Этот порядок на самом деле не свойство множества. Вы не должны полагаться на это. При заказе предметы в коллекции важны для вас, эта коллекция не установлен. "

Есть несколько сценариев, в которых моя коллекция будет содержать 50-100 предметов. Я понимаю, что это не большое количество элементов, но я все еще надеялся пожинать плоды использования HashSet вместо List.

Я обнаружил, что смотрю на следующий код и задаюсь вопросом, что делать:

LayoutManager.Instance.RegisteredItems.ToList().ForEach( item => item.DoStuff() );

vs

foreach( var item in LayoutManager.Instance.RegisteredItems)
{
    item.DoStuff();
}

RegisteredItems раньше возвращал IList<T>, но теперь он возвращает HashSet. Я чувствовал, что, если бы я использовал HashSet для эффективности, было бы неправильно разыграть его как Список. Тем не менее, приведенная выше цитата Роберта заставляет меня чувствовать себя неловко и из-за итерации.

Какой правильный вызов в этом сценарии? Спасибо

Ответы [ 3 ]

10 голосов
/ 02 ноября 2011

Если вас не волнует порядок, используйте HashSet <>. Цитата об использовании HashSet <> опасна, когда вы беспокоитесь о порядке. Если вы запускаете этот код несколько раз, а элементы работают в другом порядке, вас это волнует? Если нет, то ты в порядке. Если да, то не используйте HashSet <>. Произвольное преобразование в Список сначала не решает проблему.

И я не уверен, но я подозреваю, что .ToList () будет перебирать HashSet <>, чтобы сделать это, так что теперь вы дважды просматриваете коллекцию.

Не оптимизируйте преждевременно. Если у вас есть только 100 предметов, просто используйте HashSet <> и продолжайте. Если вы начнете заботиться о порядке, измените его на Список <> и используйте его как список везде.

2 голосов
/ 02 ноября 2011

В процитированном вопросе я думаю, что он говорит, что если вы перебираете множество, вы можете легко обмануть себя, думая, что предметы находятся в определенном порядке. Например, было бы легко по-другому относиться к первому итерированному элементу, но вы не гарантированы, что он останется первым итерированным элементом.

Пока вы помните об этом и рассматриваете множество как неупорядоченное, итерация по нему - это нормально.

2 голосов
/ 02 ноября 2011

Если вы действительно не заботитесь о порядке и знаете, что у вас не может быть дубликатов в вашем хэш-наборе (и это то, что вы хотите), продолжайте использовать хэш-набор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...