如何在Else语句中赋值当前变量并存储结果?求最近车站代码测试失败
解决你的If/Else变量赋值与最近车站查找问题
首先咱们来拆解你的两个问题,先解决核心的测试失败问题,再回答变量赋值的疑问:
问题2:单元测试失败的核心原因(也是你代码的关键bug)
你的FindNearestStation逻辑本身是没问题的,但距离计算方法写错了!看这个方法:
private int GetDistancebtween(int x1, int y1, int x2, int y2) { return (x1 - x2) ^ 2 + (y1 - y2) ^ 2; }
在C#里,^是按位异或运算符,不是数学里的平方!这就导致你计算的不是距离的平方(我们通常用平方来替代开根号,不影响远近比较),而是完全错误的数值。
比如测试里的(-10, -10)到Opera(0,0):
- 正确的距离平方是:
(-10-0)² + (-10-0)² = 100 + 100 = 200 - 但你的代码计算的是:
(-10 ^ 2) + (-10 ^ 2) = -8 + -8 = -16(按位异或的结果)
而到Chatelet(10,10)的错误计算结果会是(20 ^2)+(20^2)= 18+18=36,这就导致程序错误地认为Chatelet更近,测试自然失败。
修正方法
把平方运算改成用*(或者用Math.Pow后转int,不过*效率更高):
private int GetDistancebtween(int x1, int y1, int x2, int y2) { int dx = x1 - x2; int dy = y1 - y2; return dx * dx + dy * dy; }
修正后,距离计算就正确了,你的单元测试应该就能通过。
问题1:如何在Else语句中赋值变量以比较并保存结果
你提到之前在Else部分用Math.Min比较但没存储结果,核心是:要保存结果必须明确给变量赋值,就像你在if分支里给minDist和minStation赋值一样。
针对你的场景(找最近车站)
其实你当前的if逻辑已经是最优的:只有当当前距离比已知最小距离更小(或者还没有初始最小距离)时,才更新最小距离和对应车站。这种情况下不需要Else分支,因为我们只需要保留最小的那个值,其他情况不需要操作。
但如果你确实需要在Else分支里处理某些逻辑(比如记录次小值),可以这样写:
foreach (var station in _stations) { int dis = GetDistancebtween(x1: station.X, y1: station.Y, x2: x, y2: y); if (!minDist.HasValue || dis < minDist.Value) { // 更新最小距离和车站 minDist = dis; minStation = station; } else { // 这里处理当前距离不是最小的情况,比如保存次小值 int currentNonMinDistance = dis; Station currentNonMinStation = station; // 比如记录日志、保存到列表等操作 } }
如果你之前只是调用了Math.Min(minDist.Value, dis)但没把结果赋值给minDist,那自然不会保存结果——一定要把计算结果赋值给对应的变量,才能保留下来。
总结一下:
- 先修正距离计算的bug,这是测试失败的根本原因;
- 在分支中保存结果的关键是明确给变量赋值,不管是if还是else分支,都要把计算结果存到对应的变量里。
内容的提问来源于stack exchange,提问作者user12525138
相关产品推荐
相关产品推荐

