2010-01-13 57 views
1

我有一個Point的集合,存儲在PointCollection中。使用linq從集合中檢索點對?

我需要集合中的點來繪製線條。

因此,例如,如果點集合有四個點,那將是三行。

實施例:

(1)點(1,1) (2)點(2,2) (3)點(3,3) (4)點(4,4)

如果非要點的列表,包括上面提到的四個點的,我要繪製三個線,採用以下邏輯:

1線 - 點(1,1),點(2, 2) 第2行 - 點(2,2),點(3,3) 第3行 - 點(3,3),點(4,4)

有沒有一種方法,使用Linq,Lambda表達式,擴展方法等,從我的初始點列表中提取這些點,這樣,我可以迭代地拿走每一對點並畫出我的線條?

謝謝。

+0

如果你想那樣做,我不知道。我會: 1)嘗試獲取第一個元素,如果沒有 - 拋出異常或返回,否則將該點保存在變量中。 2)直到最後:得到另一個點,畫出一條線,將新點保存在同一個變種中。 這使它保持甜美和簡單。只有在需要時才使用LINQ。 – 2010-01-13 18:29:37

回答

2

我關閉了在第二,但這裏有一個可怕解決方案(在它使用的副作用):

Point previous = default(Point); 

return points.Select(p => { Point tmp = previous; 
          previous = p; 
          return new { p1 = tmp, p2 = previous }; 
          }) 
      .Skip(1); // Ignore first (invalid) result 

,也許可以與System.Interactive和Scan做的更好,但否則最好寫一個新的擴展方法。像這樣的事情(使用Tuple從C#4):

public static IEnumerable<Tuple<T, T>> ConsecutivePairs<T>(this IEnumerable<T> sequence) 
{ 
    // Omitted nullity checking; would need an extra method to cope with 
    // iterator block deferred execution 
    using (IEnumerator<T> iterator = sequence.GetEnumerator()) 
    { 
     if (!iterator.MoveNext()) 
     { 
      yield break; 
     } 
     T previous = iterator.Current; 
     while (iterator.MoveNext()) 
     { 
      yield return Tuple.Create(previous, iterator.Current); 
      previous = iterator.Current; 
     } 
    } 
} 

(道歉任何錯誤 - 寫在趕時間!)

+0

我很開心,有多少人遵從一個可怕的要求,並給出一個可怕的解決方案,而不是說 - 你最好這樣做。 – 2010-01-13 18:31:17

+0

雖然我認爲這不是一個可怕的請求...... – 2010-01-13 18:35:42

+0

但是,有可能存在上下文或其他條件在問題中沒有充分表現出來,使得解決方案不可怕。通常你至少可以依靠一個答案來告訴你所有的問題都是錯的。 – Mikeb 2010-01-13 18:37:09