C#使用随机索引修改二维数组时原有修改丢失问题如何解决
问题根因
你提供的简化示例代码逻辑本身没有问题,出现已修改位置自动复原的核心原因是:你实际运行的代码中,二维数组mat的初始化逻辑被放在了循环内部,每次触发随机修改操作时,都会重新生成初始状态的数组,之前的修改自然被覆盖丢失。
修复方案
1. 调整数组初始化位置
确保数组仅在程序启动时初始化一次,不要放在循环中重复实例化,以下是可直接运行的正确实现:
using System; public class Program { // 随机数实例、数组均作为全局静态成员,仅初始化一次 static Random r = new Random(); static string[,] mat = new string[3,3] {{"1","2","3"}, {"4","5","6"}, {"7","8","9"}}; public static void Main() { // 示例条件:修改满9个位置后停止循环 int modifiedCount = 0; while (modifiedCount < 9) { int a = r.Next(0,9); if (mat[a/3, a%3] != "x") { mat[a/3, a%3] = "x"; modifiedCount++; // 打印当前数组状态 for (int i = 0; i < mat.GetLength(0); i++) { for (int j = 0; j < mat.GetLength(1); j++) { Console.Write(mat[i,j]); } } Console.WriteLine(); Console.ReadLine(); } } } }
2. 标记数组兜底方案
如果后续业务逻辑需要修改数组原有值、无法用值本身判断是否被修改,可以额外新增一个同维度的布尔数组专门记录修改状态,和业务逻辑解耦:
// 初始化标记数组,默认false代表未修改 bool[,] modifiedFlags = new bool[3,3]; // 修改前判断标记位 int index = r.Next(0,9); int row = index / 3; int col = index % 3; if (!modifiedFlags[row, col]) { mat[row, col] = "x"; modifiedFlags[row, col] = true; }
内容的提问来源于stack exchange,提问作者Pitfall13
相关产品推荐
相关产品推荐

