使用给定的IEnumerable二维点的linq,假设所有点按列表中出现的顺序进行访问,找到导航所有点所需的距离。
我以为我可以以某种方式使用.Aggregate <>函数,但不知道如何使其工作。问题是聚合返回与列表相同的类型,这是我需要标量(双精度)的一点。
如果使用linq无法解决此问题,那么使用linq可以知道什么类型的问题以及不能解决什么类型的问题会很有趣。
这不是家庭作业,而是个人项目中帮助我学习linq的必需步骤。
如果您使用(或复制).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)
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)