例如,我有一系列点
列表积分=新列表{0,1,2,4,5,7};
我想将其转换为范围序列(我的类型Range(leftPoint, rightPoint)
)。例如,结果是
List<Range>
范围:{0,1} {1,2} {2,4} {4,5} {5,7}
答案 0 :(得分:5)
您可以使用LINQ(假设列表已经排序):
List<Range> rangeList = Enumerable.Range(0, points.Count - 1)
.Select(i => new Range(points[i], points[i + 1]))
.ToList();
答案 1 :(得分:4)
为什么不使用简单的for-loop?
for(var i = 0; i < points.Count() - 1; i++)
ranges.Add(new Range(points[i], points[i+1]))
答案 2 :(得分:1)
List<int> points = new List<int> { 0, 1, 2, 4, 5, 7 };
List<List<int>> listOfRanges = new List<List<int>>();
listOfRanges.Add(points.GetRange(0, 2));
listOfRanges.Add(points.GetRange(1, 2));
listOfRanges.Add(points.GetRange(2, 2));
listOfRanges.Add(points.GetRange(3, 2));
listOfRanges.Add(points.GetRange(4, 2));
答案 3 :(得分:0)
您可以像这样迭代它:
List<int> points = new List {0, 1, 2, 4, 5 ,7};
List<Range> listOfRanges = new List<Range>();
int index = 0
foreach (int value in points) {
listOfRanges.add(new Range(points[i], points[i+1]));
index++;
}
你可能会在循环的最后一次迭代中得到一个空的比较异常,因为points [i + 1]不存在 - 如果是这样的话,只需用一个简单的if语句处理它。
这是以点为单位表示整数列表。如果我发现你的意思不同,我会更新。
答案 4 :(得分:0)
您可以使用LINQ压缩我们获得的两个列表:
取出除最后一个元素之外的所有内容
除了第一个元素
这些对应于(在您的示例中):
0,1,2,4,5
1,2,4,5,7
以下是您在代码中执行此操作的方法:
var result =
points
.Take(points.Count - 1) //points except last element
.Zip(
points.Skip(1), //points except first element
(l, r) => new Range(l, r))
.ToList();