2010-02-09 28 views
2

使用給定IEnumerable二維點的linq,查找導航所有點所需的距離,假設按照它們出現在列表中的順序訪問點。使用linq查找導航點列表所需的距離

我想我可能能夠以某種方式使用.Aggregate函數,但無法弄清楚如何使其工作。問題是聚合返回與列表類型相同,這是一個我需要一個標量(double)的點。

如果使用linq不能解決這個問題,那麼知道可以使用linq無法解決哪類問題以及哪類問題無法解決將會很有趣。

這不是家庭作業,而是個人項目中的一個必要步驟,可以幫助我學習linq。

+1

訪問* which * order?它們出現在列表中的順序?張貼你到目前爲止的代碼 - 如果有人爲你做了這個練習,會有什麼用? – 2010-02-09 09:03:48

+0

我已經知道如何做到這一點,沒有LINQ謝謝 – trampster 2010-02-09 09:06:51

+0

到目前爲止你有什麼?你可以使用LINQ做一維情況嗎? – AakashM 2010-02-09 09:19:39

回答

4

這是如果你使用(或複製)的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); 
    } 
} 
+0

實際上這正是我想要的,謝謝 – trampster 2010-02-09 09:31:18

1

這個怎麼樣?假設:

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(); 
+0

實際列表計算爲更大的linq表達式的一部分,所以它是一個IEnumerable ,我無法建立索引 – trampster 2010-02-09 09:23:24

+0

您可以隨時在'IEnumerable ' – 2010-02-09 09:24:25

+2

上調用'.ToList()'我寧願不強迫執行,直到表達式儘可能結束 – trampster 2010-02-09 09:26:43

相關問題