You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,那自然不会保存结果——一定要把计算结果赋值给对应的变量,才能保留下来。


总结一下:

  1. 先修正距离计算的bug,这是测试失败的根本原因;
  2. 在分支中保存结果的关键是明确给变量赋值,不管是if还是else分支,都要把计算结果存到对应的变量里。

内容的提问来源于stack exchange,提问作者user12525138

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 09:12:38