A*寻路算法中SortedSet无法移除部分元素的问题排查
可行的修复方案
- 改用.NET内置的
PriorityQueue(推荐):.NET 6及以上版本提供的PriorityQueue类,专门适配A*这类按优先级取元素的场景。它无需元素实现IComparable,通过入队时指定的优先级(即F值)排序,支持同一元素多次入队,不会出现查找/移除失败的问题。 - 调整SortedSet的使用方式:若必须使用SortedSet,需确保:
- 节点加入集合后不再修改
F/H值;若需更新,先移除节点,修改后重新加入。 - 重新实现
CompareTo,仅用Index判断元素相等,排序逻辑保留F/H比较,但要避免同一Index的节点重复加入集合。
- 节点加入集合后不再修改
- 继续使用List:保留List实现,每次遍历找到
F值最小的节点(性能略低于SortedSet/PriorityQueue,但逻辑简单稳定)。
内容的提问来源于stack exchange,提问作者The RESEARCHER
相关产品推荐
相关产品推荐

