如何将当前 var 分配给 else 语句以便能够比较 var 值,然后将其保存以获得结果?

Posted

技术标签:

【中文标题】如何将当前 var 分配给 else 语句以便能够比较 var 值,然后将其保存以获得结果?【英文标题】:How can I assign a current var to else statement to be able to compare the var value and then save it to get a result? 【发布时间】:2020-04-26 22:20:54 【问题描述】:

我有一个 If Else 语句从当前站点获取最近的站点,这意味着第一个最近站点为空(不存在),第二个站点是根据第一个站点的最小距离计算的。在其他部分,我使用 Math.Min 将当前站的距离与已知的最小距离进行比较。但是,我缺少存储结果并在 Else 语句中分配当前站。我的问题的地方是第 14 行和第 15 行。

class City : ICity
    
        private List<Company> _companies;
        private List<Line> _lines;
        private List<Station> _stations;
        internal City(string name)
        
            this.Name = name;
            _companies = new List<Company>();
            _lines = new List<Line>();
            _stations = new List<Station>();
        
        public string Nameget;
        public ILine AddLine(string name)... 
        public IStation AddStation(string name, int x, int y)...

        public IStation FindNearestStation(int x, int y)
        
            int ? minDist = null;
            Station minStation=null;
            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;
                
            
            return minStation;            
        

        private int GetDistancebtween(int x1, int y1, int x2, int y2)
        
            return (x1 - x2) ^ 2 + (y1 - y2) ^ 2; 

                    

单元测试在第 10 行中断。

public void city_returns_effectively_the_closest_station()

    ICity c = CityFactory.CreateCity("Paris");

    IStation s = c.AddStation("Opera", 0, 0);
    IStation s1 = c.AddStation("Chatelet", 10, 10);

    c.FindNearestStation(-10, -10).Should().BeSameAs(s);
    //test does not pass in this position
    c.FindNearestStation(10, 10).Should().BeSameAs(s1);
    c.FindNearestStation(15, 15).Should().BeSameAs(s1);

【问题讨论】:

【参考方案1】:

如果您更改 minDist 值,那么您也应该更改 minStation 值。在 else 块中使用简单的 if 而不是 Math.Min 应该可以解决问题。

....
else

    if(dis < minDist.Value)
    
        minDist = dis;
        minStation = station;
    

这会在不使用 else 块的情况下导致进一步的变化

foreach (var station in _stations)

    var dis = GetDistancebtween(x1: x, y1: y, x2: station.X, y2: station.Y);
    if(!minDist.HasValue || dis < minDist.Value)
    
        minDist = dis;
        minStation = station;
    

【讨论】:

这仍然在第 9 行的单元测试的同一级别中断,所以要早一点。 您能添加 GetDistancebtween 的代码吗? 0,0 应该在 -10,-10 和 10,10 的相同距离,但似乎并非如此。内部 stations 变量也是一个列表,对吗? 可能很重要的信息。函数 findNearestStation 位于具有 ICity 接口的 City 类中。我计算距离时的函数是这个函数:``` private int GetDistancebtween(int x1, int y1, int x2, int y2) return (x1 - x2) ^ 2 + (y1 - y2) ^ 2; ``` 我在问题中添加的其余信息。 不确定,但是快速搜索最近点公式并不是你写的那样。如果我将您的公式与您的数据一起使用,我会得到(在 FindNearestStation 1st 中添加 Console.WriteLine:Name=Opera - Distance=4 Name=Chatelet - Distance=0 Found = Chatelet 2nd:Name= Opera - Distance=12 Name=Chatelet - Distance=0 Found = Chatelet 第三个:Name=Opera - Distance=0 Name=Chatelet - Distance=4 Found = Opera 您的意思是当您进行手动测试并将单元测试的值放在 else 语句或函数 getDistanceBetween 中?

以上是关于如何将当前 var 分配给 else 语句以便能够比较 var 值,然后将其保存以获得结果?的主要内容,如果未能解决你的问题,请参考以下文章

将 Int 值分配给精灵节点

if-else 中的值 [重复]

如何使用 pyspark 将 null 分配给配置单元表列

python循环

如何将相同的 var 类型变量分配给不同的 linq to sql 结果集?

如何使用for循环将返回值分配给变量