使用給定IEnumerable二維點的linq,查找導航所有點所需的距離,假設按照它們出現在列表中的順序訪問點。使用linq查找導航點列表所需的距離
我想我可能能夠以某種方式使用.Aggregate函數,但無法弄清楚如何使其工作。問題是聚合返回與列表類型相同,這是一個我需要一個標量(double)的點。
如果使用linq不能解決這個問題,那麼知道可以使用linq無法解決哪類問題以及哪類問題無法解決將會很有趣。
這不是家庭作業,而是個人項目中的一個必要步驟,可以幫助我學習linq。
使用給定IEnumerable二維點的linq,查找導航所有點所需的距離,假設按照它們出現在列表中的順序訪問點。使用linq查找導航點列表所需的距離
我想我可能能夠以某種方式使用.Aggregate函數,但無法弄清楚如何使其工作。問題是聚合返回與列表類型相同,這是一個我需要一個標量(double)的點。
如果使用linq不能解決這個問題,那麼知道可以使用linq無法解決哪類問題以及哪類問題無法解決將會很有趣。
這不是家庭作業,而是個人項目中的一個必要步驟,可以幫助我學習linq。
這是如果你使用(或複製)的Zip extension method available in .net 4容易得多:
var distances = points.Zip(points.Skip(1), Distance);
double totalDistance = distances.Sum();
使用距離方法:
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);
}
Bart explains (and shows you how to implement) zip on his blog:
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);
}
}
實際上這正是我想要的,謝謝 – trampster 2010-02-09 09:31:18
這個怎麼樣?假設:
struct Point
{
public int X;
public int Y;
public Point(int x, int y) { X=x; Y=y; }
}
double Distance(Point p1, Point p2)
{
return Math.Sqrt(Math.Pow(p1.X-p2.X,2) + Math.Pow(p1.Y-p2.Y,2));
}
var list = new List<Point>{...};
然後
var distance = list
.Select((p,i) => i == list.Count-1? 0 : Distance(p,list[i+1])).Sum();
訪問* which * order?它們出現在列表中的順序?張貼你到目前爲止的代碼 - 如果有人爲你做了這個練習,會有什麼用? – 2010-02-09 09:03:48
我已經知道如何做到這一點,沒有LINQ謝謝 – trampster 2010-02-09 09:06:51
到目前爲止你有什麼?你可以使用LINQ做一維情況嗎? – AakashM 2010-02-09 09:19:39