查找使用linq导航点列表所需的距离

tra*_*ter 3 .net c# linq

使用给定的IEnumerable二维点的linq,假设所有点按列表中出现的顺序进行访问,找到导航所有点所需的距离。

我以为我可以以某种方式使用.Aggregate <>函数,但不知道如何使其工作。问题是聚合返回与列表相同的类型,这是我需要标量(双精度)的一点。

如果使用linq无法解决此问题,那么使用linq可以知道什么类型的问题以及不能解决什么类型的问题会很有趣。

这不是家庭作业,而是个人项目中帮助我学习linq的必需步骤。

Rob*_*sor 5

如果您使用(或复制).net 4中可用Zip扩展方法,则这会容易得多:

var distances = points.Zip(points.Skip(1), Distance);
double totalDistance = distances.Sum();
Run Code Online (Sandbox Code Playgroud)

使用距离方法:

double Distance(Point p1, Point p2)
{
    double dx = p1.X-p2.X;
    double dy = p1.Y-p2.Y;
    return Math.Sqrt( dx*dx+dy*dy );
}
Run Code Online (Sandbox Code Playgroud)

Bart在他的博客上解释(并向您展示了如何实现)zip:

static class Enumerable 
{ 
    public static IEnumerable<TResult> Zip<TFirst, TSecond, TResult>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> func) 
    { 
        var ie1 = first.GetEnumerator(); 
        var ie2 = second.GetEnumerator();

        while (ie1.MoveNext() && ie2.MoveNext()) 
            yield return func(ie1.Current, ie2.Current); 
    } 
}
Run Code Online (Sandbox Code Playgroud)