我有一个Point集合,存储在PointCollection中。
我需要集合中的点来绘制线条。
因此,例如,如果一个点集合有四个点,那将是三行。
示例:
(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 :(得分: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
做得更好,但是否则最好编写一个新的扩展方法。这样的事情(使用C#4中的Tuple
):
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;
}
}
}
(对于任何错误道歉 - 写得匆匆!)