Зачем мне использовать HashSet вместо словаря?C#

Место общения программистов C#
Ответить
Anonymous
 Зачем мне использовать HashSet вместо словаря?

Сообщение Anonymous »

Я пытаюсь реализовать список кэшированных путей на алгоритме A*. В настоящее время кэшированные пути хранятся в следующем списке:

Код: Выделить всё

readonly List _cachedPaths = new List();
Операции, выполняемые над этим списком:

FirstOrDefault для получения элемента, удовлетворяющего определенным условиям

Код: Выделить всё

var cached = _cachedPaths.FirstOrDefault(p => p.From == from && p.To == target && p.Actor == self);
Удалить и элемент

Код: Выделить всё

_cachedPaths.Remove(cached);
Дополнения

Код: Выделить всё

_cachedPaths.Add(new CachedPath {
From = from,
To = target,
Actor = self,
Result = pb,
Tick = _world.WorldTick
});
ПРИМЕЧАНИЕ. Класс CachedPath имеет GetHashCode и Equals, переопределяемые только From, To и Actor, поэтому два экземпляра, имеющие эти же атрибуты, имеют одинаковый хэш и равенство.< /p>

Учитывая, что быстрый поиск (содержит), вставки и удаления в «HashSet» равен O (1) (если я не ошибаюсь), я рассмотрел возможность использования «HashSet» ', чтобы выполнить эти операции. Единственная проблема — это FirstOrDefault: чтобы получить ее, мне пришлось перечислить всю коллекцию.

Учитывая эту проблему, я рассмотрел возможность использования словаря, индексированного по хешу From. , Кому и Актеру:

Код: Выделить всё

Dictionary cachedPath
Еще раз, если я не ошибаюсь, Dictionary также предлагает O(1) при вставке, удалении, а также поиске по ключу. Это наводит меня на мысль, что словарь — это возможность извлечения элементов HashSet + O(1).

Я что-то упустил? Действительно ли Dictionary лучше HashSet в том смысле, что он поддерживает больше операций?

Заранее спасибо.

Подробнее здесь: https://stackoverflow.com/questions/280 ... dictionary
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»