Я пытаюсь реализовать список кэшированных путей по алгоритму A *. В настоящее время, кэшированные пути хранятся в виде списка, как это:Почему я должен использовать HashSet над Словарем?
readonly List<CachedPath> _cachedPaths = new List<CachedPath>();
Операции, выполняемые над этого списка:
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 и актера, так два экземпляра, которые имеют те же атрибуты имеют одинаковый хеш и равенство.
Учитывая, что быстрый поиск (содержит), вставки и удаления в «HashSet» - это O (1) (если я не ошибаюсь), я рассматривал использование «HashSet» для выполнения этих операций. Единственная проблема - FirstOrDefault, что я должен был перечислить всю коллекцию, чтобы получить ее.
Учитывая эту проблему, я считал также, используя словарь проиндексированы хэш From, To и Актер:
Dictionary<int, CachedPath> cachedPath
Еще раз, если я не ошибаюсь, словарь также предлагает O (1) в вставки, удаления, а также поиск по ключу. Это заставляет меня думать, что словарь - это возможность поиска элементов HashSet + O (1).
Я что-то упустил? Действительно ли Словарь лучше, чем HashSet, в том смысле, что он поддерживает больше операций?
Заранее спасибо.
http://stackoverflow.com/questions/2728500/hashsett-versus-dictionaryk-vwrt-searching-time-to-find-if-an-item-exist –