C#中基于25元素整数List生成打印特殊5x5棋盘的最优方案
最优实现方案
针对你的需求,最适合的方案是使用预定义索引映射表,既可以保留原有List底层存储逻辑,又能高效适配特殊的棋盘索引规则,实现成本和性能开销都极低。
1. 预定义静态映射数组
首先根据你的棋盘索引规则,预先构造「棋盘显示索引→底层List存储索引」的映射关系,数组长度固定为25,只需初始化一次即可全局复用:
// 数组下标:对应特殊规则下的棋盘索引(即B(b)的0~24位) // 数组值:对应底层List<int>中的实际存储下标(即B(a)的索引) private static readonly int[] _boardMap = new int[25] { // 请按B(b)从0到24的顺序,依次填入对应B(a)的索引值即可 // 例:你提到B(b)[6]对应B(a)[7],所以数组第7位(下标为6)填入7 24,23,22,21,20, 19,18,17,16,15, 14,13,7,11,10, 9,8,6,5,4, 3,2,1,0,12 // 以上为示例值,对照你的索引规则替换为正确的25个映射值即可 };
2. 实现棋盘打印方法
需要打印棋盘时,直接按行遍历映射表取值即可,完全无需修改原有存储逻辑:
public void PrintSpecialBoard(List<int> underlyingList) { for (int row = 0; row < 5; row++) { for (int col = 0; col < 5; col++) { int displayIdx = row * 5 + col; int realValue = underlyingList[_boardMap[displayIdx]]; Console.Write($"{realValue}\t"); } Console.WriteLine(); } }
3. 可选扩展:封装索引取值方法
如果业务逻辑中需要频繁按特殊棋盘索引取值,可以封装扩展方法简化调用:
public static class BoardExtension { private static readonly int[] _boardMap = new int[25] { /* 填入正确的映射关系 */ }; public static int GetBoardValue(this List<int> list, int specialIndex) { if (specialIndex is < 0 or >= 25) throw new ArgumentOutOfRangeException(nameof(specialIndex), "索引必须在0~24范围内"); return list[_boardMap[specialIndex]]; } } // 调用示例:获取B(b)[6]对应的值 int value = x.GetBoardValue(6);
方案优势
- 性能极高:映射表寻址为O(1)操作,无额外计算开销,完全适配游戏高频调用场景
- 逻辑解耦:底层存储和上层显示逻辑完全分离,后续调整棋盘索引规则只需修改映射表即可,无需改动业务代码
- 易维护:映射规则一目了然,排查索引错误的成本远低于动态坐标转换公式
内容的提问来源于stack exchange,提问作者Sharki
相关产品推荐
相关产品推荐

