使用linq从集合中检索点对?

时间:2010-01-13 18:22:15

标签: c# linq

我有一个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表达式,扩展方法等,从我的初始点列表中成对提取这些点?这样我可以迭代地取每对点并画出我的线条?

感谢。

1 个答案:

答案 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;
        }
    }
}

(对于任何错误道歉 - 写得匆匆!)