C#如何获取二维布尔数组中已使用的最大索引
获取二维布尔数组中已赋值元素的最大索引
方案一:赋值时实时记录最大索引(推荐)
这种方法简单高效,不用事后遍历整个数组。每次给元素赋值时,同步更新当前的最大X、Y索引即可,很适合刚接触C#的新手。
基础实现代码
// 初始化二维布尔数组,这里X维度长度3,Y维度长度4 bool[,] booleans = new bool[3, 4]; int maxX = -1; int maxY = -1; // 赋值同时更新最大索引 booleans[0, 0] = false; maxX = Math.Max(maxX, 0); maxY = Math.Max(maxY, 0); booleans[0, 1] = false; maxX = Math.Max(maxX, 0); maxY = Math.Max(maxY, 1); booleans[1, 0] = false; maxX = Math.Max(maxX, 1); maxY = Math.Max(maxY, 0); booleans[1, 1] = false; maxX = Math.Max(maxX, 1); maxY = Math.Max(maxY, 1); booleans[2, 3] = false; maxX = Math.Max(maxX, 2); maxY = Math.Max(maxY, 3); // 输出结果 Console.WriteLine($"最大X索引:{maxX},最大Y索引:{maxY}");
封装成方法简化代码
如果需要多次赋值,把逻辑封装成方法可以避免重复代码:
static void AssignAndTrackMax(bool[,] arr, int x, int y, bool value, ref int maxX, ref int maxY) { arr[x, y] = value; maxX = Math.Max(maxX, x); maxY = Math.Max(maxY, y); } // 使用封装后的方法 bool[,] booleans = new bool[3, 4]; int maxX = -1; int maxY = -1; AssignAndTrackMax(booleans, 0, 0, false, ref maxX, ref maxY); AssignAndTrackMax(booleans, 0, 1, false, ref maxX, ref maxY); AssignAndTrackMax(booleans, 1, 0, false, ref maxX, ref maxY); AssignAndTrackMax(booleans, 1, 1, false, ref maxX, ref maxY); AssignAndTrackMax(booleans, 2, 3, false, ref maxX, ref maxY); Console.WriteLine($"最大X索引:{maxX},最大Y索引:{maxY}");
方案二:遍历数组查找(需区分已使用元素)
C#中普通bool数组的默认值是false,如果你的“已使用”元素也是false,没法直接通过值区分手动赋值和默认元素。这时候可以用两种方式解决:
方式1:使用可空布尔数组(bool?)
可空布尔数组的默认值是null,手动赋值的元素会是true或false,以此区分是否被使用:
// 初始化可空布尔数组 bool?[,] booleans = new bool?[3, 4]; // 手动标记已使用的元素 booleans[0, 0] = false; booleans[0, 1] = false; booleans[1, 0] = false; booleans[1, 1] = false; booleans[2, 3] = false; int maxX = -1; int maxY = -1; // 遍历所有元素 for (int x = 0; x < booleans.GetLength(0); x++) { for (int y = 0; y < booleans.GetLength(1); y++) { // 判断元素是否被手动赋值(不为null) if (booleans[x, y] != null) { maxX = Math.Max(maxX, x); maxY = Math.Max(maxY, y); } } } Console.WriteLine($"最大X索引:{maxX},最大Y索引:{maxY}");
方式2:约定已使用元素为true
如果可以调整规则,用true标记已使用元素,默认false代表未使用,直接遍历判断值即可:
bool[,] booleans = new bool[3, 4]; // 已使用元素设为true booleans[0, 0] = true; booleans[0, 1] = true; booleans[1, 0] = true; booleans[1, 1] = true; booleans[2, 3] = true; int maxX = -1; int maxY = -1; for (int x = 0; x < booleans.GetLength(0); x++) { for (int y = 0; y < booleans.GetLength(1); y++) { if (booleans[x, y]) { maxX = Math.Max(maxX, x); maxY = Math.Max(maxY, y); } } } Console.WriteLine($"最大X索引:{maxX},最大Y索引:{maxY}");
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

