以下代码计算两点的最近距离。
对于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);
}
}
}
答案 0 :(得分:3)
您可以在内部循环之前将nearestDistant[i]
初始化为Double.MaxValue
,然后您可以移除if
。
这样做的副作用是UsedServices.Count == 0
将nearestDistant[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);
}
}