0

以下代码计算两点的最近距离。该部分if(j==0)对 UsedServices.Count-1 次进行了冗余测试,有没有办法不引入这种冗余?当然,我们可以将 case 与 for 循环分开,我只是在想有没有更优雅的方法来实现这一点。

double[] nearestDistant=new double[UnUsedServices.Count];

for (int i=0;i<UnUsedServices.Count;i++)
{
    for (int j=0;j<UsedServices.Count;j++)
    {
        double distance=GetDistance(UnUsedServices[i].coords, 
                                    UsedServices[j].coords);

        if (j==0) //Used once and redundant for UsedServices.Count-1 time!
        {
            nearestDistant[i] = distance;
        }
        else
        {
            nearestDistant[i] = Math.Min(nearestDistant[i], distance);
        }
    }
}
4

4 回答 4

3

您可以在内部循环之前初始化nearestDistant[i]Double.MaxValue然后您可以删除if.

这样做的副作用是UsedServices.Count == 0nearestDistant[i]设置为Double.MaxValue。如果对你而言没问题的话。

于 2012-10-10T02:29:15.970 回答
0

如果您关心表达式评估和分支预测,请不要担心 - 让编译器来优化它。

如果您希望在代码方面对其进行简化,那么“?” 三元运算符是一个选项:

nearestDistant[i] = j == 0 ? distance : Math.Min(nearestDistant[i], distance);
于 2012-10-10T02:29:27.813 回答
0
for(int i=0;i<UnUsedServices.Count;i++)
{
    if(UsedServices.Count > 0)
    {
      double distance=GetDistance(UnUsedServices[i].coords, UsedServices[0].coords);
       nearestDistant[i] = distance;
    }

    for(int j=1;j<UsedServices.Count;j++)
    {
        double distance=GetDistance(UnUsedServices[i].coords, UsedServices[j].coords);

        nearestDistant[i] = Math.Min(nearestDistant[i], distance);
    }
}
于 2012-10-10T02:30:50.667 回答
0

在进入“j”循环之前,如何将最近距离 [i] 初始化为一个远大于任何距离值的数字。然后你可以使用

 double[] nearestDistant=new double[UnUsedServices.Count];

for(int i=0;i<UnUsedServices.Count;i++)
            {

            nearestDistant[i] = <A REALLY HUGE NUMBER>

            for(int j=0;j<UsedServices.Count;j++)
            {
                double distance=GetDistance(UnUsedServices[i].coords, UsedServices[j].coords);

                nearestDistant[i] = Math.Min(nearestDistant[i], distance);
            }
        }
于 2012-10-10T02:31:00.313 回答