C#二维数组特定行列获取与比较问题求助
问题分析与解决方案
首先,你的代码始终进入else分支的核心原因是搞反了C#二维数组的索引顺序!在C#中,string[,]类型的二维数组索引规则是[行索引, 列索引],而你写的table2[col, row]把列索引放在了前面、行索引放在后面,导致你取到的完全不是你想要的位置的值,自然无法触发预期的条件判断。
关键错误点
你想要获取**第3列(索引2)第1行(索引0)**的值,正确写法是table2[0, 2],而不是table2[2, 0]——后者实际取的是第3行第1列的值,和你的需求完全偏离。这就导致你的origin和other变量拿到的要么是默认的null,要么是错误位置的值,所以条件永远不成立,只能进入else分支。
修正后的基础比较逻辑
针对你的测试数据PP,B,P,P,B(假设对应第0行的列0=PP、列1=B、列2=P、列3=P、列4=B),先写出正确的取值与比较代码:
// 定义目标位置:第3列(索引2)第1行(索引0) int targetRow = 0; int startCol = 2; // 获取目标值:第3列第1行 string origin = table2[targetRow, startCol]; // 优先取同列下一行(第3列第2行),如果为null则取右侧列的同一行(第4列第1行) string compareValue = table2[targetRow + 1, startCol] ?? table2[targetRow, startCol + 1]; // 用更安全的方式判断空值与相等性 if (!string.IsNullOrEmpty(origin) && origin.Equals(compareValue)) { Debug.Log("第3列第2行有值,且与第3列第1行相等"); } else { Debug.Log("第3列第2行无值,已切换到第4列第1行进行比较"); }
适配完整需求(依次往后列递推比较)
如果你的需求是:从第3列开始,先比较当前列的下一行;若下一行无值,则和右侧列的同一行比较;若右侧列也无值,继续往右递推直到找到有值的位置或遍历完所有列,可通过循环实现完整逻辑:
string[,] table2 = new string[104, 6]; // 先给测试数据赋值(匹配你的PP,B,P,P,B) table2[0, 0] = "PP"; table2[0, 1] = "B"; table2[0, 2] = "P"; table2[0, 3] = "P"; table2[0, 4] = "B"; // 若要测试第3列第2行有值的场景,可打开下面的注释 // table2[1, 2] = "P"; int targetRow = 0; int currentCol = 2; // 从第3列开始 string origin = table2[targetRow, currentCol]; string compareValue = null; bool foundValidValue = false; // 第一步:检查同列下一行 if (!string.IsNullOrEmpty(table2[targetRow + 1, currentCol])) { compareValue = table2[targetRow + 1, currentCol]; foundValidValue = true; Debug.Log($"使用第{currentCol + 1}列第{targetRow + 2}行的值进行比较"); } else { // 同列下一行无值,往右遍历列找同一行的有效数据 while (currentCol < table2.GetLength(1) - 1) { currentCol++; if (!string.IsNullOrEmpty(table2[targetRow, currentCol])) { compareValue = table2[targetRow, currentCol]; foundValidValue = true; Debug.Log($"第{currentCol}列下一行无值,切换到第{currentCol + 1}列第{targetRow + 1}行的值进行比较"); break; } } } // 最终判断逻辑 if (foundValidValue && !string.IsNullOrEmpty(origin) && origin.Equals(compareValue)) { Debug.Log("找到匹配的值"); } else if (!foundValidValue) { Debug.Log("后续列和行都没有可比较的有效数据"); } else { Debug.Log("值不匹配"); }
额外优化建议
- 避免直接用
==比较字符串,优先使用string.Equals(),既能避免null引用异常,还能指定比较规则(比如忽略大小写)。 - 用
string.IsNullOrEmpty()或string.IsNullOrWhiteSpace()判断空值,比直接判断== null更全面,能覆盖空字符串的场景。 - 建议把比较逻辑抽成单独的方法,和原代码中的
foreach循环解耦,提升代码的可读性和复用性。
内容的提问来源于stack exchange,提问作者Ginxxx
相关产品推荐
相关产品推荐

