【发布时间】:2015-03-16 12:55:12
【问题描述】:
我正在尝试在 A* 算法上实现缓存路径列表。目前,缓存的路径存储在这样的列表中:
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 和 Actor 覆盖,因此具有这些相同属性的两个实例具有相同的哈希和相等性。
鉴于“HashSet”中的快速查找(包含)、插入和删除是 O(1)(如果我没记错的话),我考虑使用“HashSet”来执行这些操作。唯一的问题是 FirstOrDefault,我必须枚举整个集合才能得到它。
鉴于这个问题,我还考虑使用由 From、To 和 Actor 的哈希索引的 Dictionary:
Dictionary<int, CachedPath> cachedPath
再一次,如果我没记错的话,Dictionary 还提供了 O(1) 的插入、删除和 Key 检索。这让我认为 Dictionary 是一种 HashSet + O(1) 元素检索功能。
我错过了什么吗?从支持更多操作的意义上说,Dictionary 真的比 HashSet 更好吗?
提前致谢。
【问题讨论】:
标签: c# dictionary hashset