一尘不染

LINQ查找连续数字系列

algorithm

我有一个整数列表。我想在该列表中查找所有连续的数字,这些数字由起始索引和长度定义。因此,例如,对于的输入列表[1,2,3,5,7,8],输出将为[{1,3}, {5,1}, {7,2}]。这很容易使用循环来完成,就像这样(未经测试的伪代码):

for(i=1, i < maxNum; i++)
{
  number = list[i];
  previousNumber = list[i-1];
  if(number - previousNumber == 1)
  {
    runLength++;
  }
  else
  {
    result.Add(startingNumber, runLength);
    runLength = 1;
    startingNumber = number;
  }
}

但是我认为使用LINQ是可能的。任何想法如何做到这一点?


阅读 328

收藏
2020-07-28

共1个答案

一尘不染

linqish的方式可能是 编写 GroupWhile如下所示 的扩展方法 (省略了所有检查。未经优化易于理解。)

int[] list = new int[] { 1, 2, 3, 5, 7, 8 };
var result = list.GroupWhile((x, y) => y - x == 1)
                 .Select(x => new {i = x.First(), len = x.Count()  })
                 .ToList();

public static IEnumerable<IEnumerable<T>> GroupWhile<T>(this IEnumerable<T> seq, Func<T,T,bool> condition)
{
    T prev = seq.First();
    List<T> list = new List<T>() { prev };

    foreach(T item in seq.Skip(1))
    {
        if(condition(prev,item)==false)
        {
            yield return list;
            list = new List<T>();
        }
        list.Add(item);
        prev = item;
    }

    yield return list;
}

TODO:使用IGrouping:)

2020-07-28