调试获取数组中字符XY坐标的函数问题求助
问题分析与修复方案
我来帮你拆解下这个函数为啥没法正确定位字符,以及怎么解决:
核心问题
你的函数参数sym是string类型,但你在循环里拿char类型的line[i]和它做Equals比较——不同类型的对象用Equals永远匹配不上,所以不管你找什么字符,这个判断条件永远是false,循环会完整遍历所有行和列,最后返回数组的最大X、Y值,看起来就像“找不到任何字符”。
修复方案
这里提供几种修复方式,你可以根据需求选:
方案1:把参数改成char类型(最直接)
既然你要找的是单个字符,直接把参数类型换成char,这样就能直接用==比较,逻辑更清晰:
public Position getXY(char sym) { int y = 0; int x = 0; var lines = _draw.GetBackground(); foreach (string line in lines) { x = 0; for (int i = 0; i < line.Length; i++) { if (line[i] == sym) goto End; x++; } y++; } End: return new Position(x, y); }
方案2:保留string参数,但转成char再比较
如果必须用string参数(比如调用方只能传字符串),记得先把字符串转成单个char,同时加个参数校验避免异常:
public Position getXY(string sym) { // 先校验参数,确保是单个字符的字符串 if (string.IsNullOrEmpty(sym) || sym.Length != 1) throw new ArgumentException("sym必须是单个字符的字符串"); char targetChar = sym[0]; int y = 0; int x = 0; var lines = _draw.GetBackground(); foreach (string line in lines) { x = 0; for (int i = 0; i < line.Length; i++) { if (line[i] == targetChar) goto End; x++; } y++; } End: return new Position(x, y); }
方案3:优化代码结构,去掉goto(更易读)
很多开发者不太喜欢用goto,可以改成提前return的写法,同时还能处理“找不到字符”的情况,避免返回最大坐标造成误解:
public Position getXY(char sym) { var lines = _draw.GetBackground(); // 用索引遍历,直接拿到y坐标 for (int y = 0; y < lines.Count; y++) { string line = lines[y]; for (int x = 0; x < line.Length; x++) { if (line[x] == sym) { // 找到就直接返回坐标 return new Position(x, y); } } } // 没找到的话,返回一个明确的标记值,比如(-1,-1),或者抛出异常 return new Position(-1, -1); // 也可以抛出异常:throw new InvalidOperationException("未找到目标字符"); }
额外提示
之前的代码在找不到字符时会返回数组的最大X、Y值,很容易让你误以为“找到了”,建议修复后加上未找到的处理逻辑(比如返回特殊坐标或抛出异常),这样调试起来更清晰。
内容的提问来源于stack exchange,提问作者Jack Griggs
相关产品推荐
相关产品推荐

