C#中非矩形网格适配的多向链表数据结构选型咨询
关于非矩形网格的四向邻接结构的C#实现建议
首先明确你提到的这种带top/down/left/right指针的结构,标准术语一般称为四向连通网格节点结构,本质上是图数据结构中无向图节点的特定实现(每个节点固定关联4个邻接节点),在游戏开发场景里也常被叫做网格图节点(Grid Graph Node)。
C#有没有适配的内置结构?
很遗憾,.NET标准库(包括C#)并没有专门针对这种四向邻接网格的内置结构。因为这种结构是高度场景化的(主要用于游戏寻路、动态网格计算等),通用类库不会提供这么细分的实现——毕竟不同场景对网格节点的附加属性(比如可通行性、移动成本)需求差异很大。
从零构建自定义结构还是扩展现有结构?
我的建议是优先从零构建自定义结构,原因如下:
- 扩展现有结构(比如
LinkedListNode<T>)会非常别扭:LinkedList本身是双向链表,要扩展成四向需要额外维护四个指针,不仅代码冗余,还会暴露很多不需要的双向链表方法,增加维护成本。 - 自定义结构可以完全贴合你的需求:你可以直接把笛卡尔坐标、邻接指针、游戏开发需要的属性(比如
IsWalkable、移动成本)都封装到一个类里,逻辑更清晰,后续扩展A*寻路、半径查询也更方便。
给你一个极简的自定义结构示例,你可以根据需求扩展:
public class GridNode { // 笛卡尔坐标 public int X { get; set; } public int Y { get; set; } // 四向邻接节点指针 public GridNode Top { get; set; } public GridNode Down { get; set; } public GridNode Left { get; set; } public GridNode Right { get; set; } // 游戏开发常用属性示例 public bool IsWalkable { get; set; } public float MovementCost { get; set; } public object GridData { get; set; } // 存储节点关联的自定义数据 public GridNode(int x, int y, bool isWalkable = true) { X = x; Y = y; IsWalkable = isWalkable; MovementCost = 1.0f; // 默认移动成本 } }
如果需要全局管理网格(比如动态增删节点、快速通过坐标查找节点),可以再封装一个GridManager类,用Dictionary<(int X, int Y), GridNode>来维护坐标到节点的映射,同时在增删节点时自动更新相邻节点的指针,比如:
public class GridManager { private readonly Dictionary<(int X, int Y), GridNode> _nodes = new(); public void AddNode(GridNode node) { _nodes[(node.X, node.Y)] = node; // 更新上下左右节点的邻接指针 if (_nodes.TryGetValue((node.X, node.Y + 1), out var topNode)) { node.Top = topNode; topNode.Down = node; } // 同理处理down/left/right的指针关联 } public GridNode GetNode(int x, int y) { _nodes.TryGetValue((x, y), out var node); return node; } }
额外补充
这种结构天生适合你提到的游戏开发需求:
- A*寻路:可以直接通过节点的四向指针遍历邻接节点,结合每个节点的
MovementCost计算路径成本。 - 半径内查询:用广度优先搜索(BFS)从目标节点出发,遍历指定层数的邻接节点即可。
- 动态增删改:通过
GridManager维护节点关系,增删节点时只需要更新相邻节点的指针,比二维数组灵活太多。
内容的提问来源于stack exchange,提问作者Xrs
相关产品推荐
相关产品推荐

