在循环中检查一次

时间:2012-10-10 02:20:50

标签: c#

以下代码计算两点的最近距离。 对于UsedServices.Count-1时间,对if(j==0)部分进行了冗余测试, 有没有办法不引入这种减少? 当然我们可以将案例与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 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

如果您担心表达式评估和分支预测,那么不要担心它 - 将其留给编译器进行优化。

如果您希望以代码方式简化它,那么'?' ternary operator是一个选项:

nearestDistant[i] = j == 0 ? distance : Math.Min(nearestDistant[i], distance);

答案 2 :(得分: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);
    }
}

答案 3 :(得分:0)

在进入'j'循环之前,将nearestDistant [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);
            }
        }