我有一个整数列表。我想在该列表中查找所有连续的数字,这些数字由起始索引和长度定义。因此,例如,对于的输入列表[1,2,3,5,7,8],输出将为[{1,3}, {5,1}, {7,2}]。这很容易使用循环来完成,就像这样(未经测试的伪代码):
[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是可能的。任何想法如何做到这一点?
linqish的方式可能是 编写 GroupWhile如下所示 的扩展方法 (省略了所有检查。未经优化易于理解。)
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:)
IGrouping