获取List中所有相邻元素的元组

时间:2016-01-18 19:56:47

标签: c# linq

我想查找满足条件a < X <= b的所有连续元素,然后将它们成对存储(a,b)

到目前为止,这会找到所有b

Tuple<Vector2, Vector2> getPointsWithinInterval(double X)
{
    var points = List<Vector2> {...};

    var list_of_b = Points.Skip(1).Where((p, i) =>
        points[i].X < X  &&  X <= p.X                // condition
    );
}

编辑:根据@MattBurland的建议,我提出了一些不太优雅的解决方案

var ranges = Points
    .Skip(1)
    .Where((p, i) =>
        Points[i].X < X && X <= p.X)
    .Select((p, i) => new Tuple<Vector2, Vector2>(Points[i - 1], Points[i]));

示例:

X = 2

(1, 0)
(3, 0)
(1, 0)
(5, 0)
(6, 0)

返回:

(1, 0) , (3, 0)
(1, 0) , (5, 0)

2 个答案:

答案 0 :(得分:5)

这是抽象点的解决方案 它可以扩展为Vector2。

var pairs = points
    .Take(points.Count - 1)
    .Zip(points.Skip(1), Tuple.Create)
    .Where(pair => pair.Item1.X < x && x <= pair.Item2.X)

答案 1 :(得分:1)

如果我正确地理解你,那会是这样的:

var pairs = list_of_b.Select((pair,idx) => 
    new Tuple<Vector2,Vector2>(points[idx-1], points[idx]);

修改,实际上,由于可能会过滤掉某些项目的Where(以及实际的Skip),Select中的索引会是不正确。您需要从一开始就选择这些索引。类似的东西:

var ranges = Points
    .Select((p,i) => new { p, i })   // now i will always match the indexes in Points
    .Skip(1)
    .Where(p =>
        Points[p.i].X < X && X <= p.p.X)
    .Select((p) => new Tuple<Vector2, Vector2>(Points[p.i - 1], Points[p.i]));

但这确实感觉非常不优雅。