如何将一系列点转换为范围序列?

时间:2016-05-23 10:06:51

标签: c# collections

例如,我有一系列点

列表积分=新列表{0,1,2,4,5,7};

我想将其转换为范围序列(我的类型Range(leftPoint, rightPoint))。例如,结果是

  

List<Range>范围:{0,1} {1,2} {2,4} {4,5} {5,7}

5 个答案:

答案 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压缩我们获得的两个列表:

  1. 取出除最后一个元素之外的所有内容

  2. 除了第一个元素

  3. 之外的所有内容

    这些对应于(在您的示例中):

    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();
    
相关问题