我想查找满足条件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)
答案 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]));
但这确实感觉非常不优雅。