查找序列号

Bar*_*xto 1 c# sql math coding-style

我有一组数字List<int>(例如):1,3,4,5,7,12,13,14,15,20,22,24,28,29,30

我希望将它们按顺序分组:

Sequence1 = from 1 amount 1 (1)
Sequence2 = from 3 amount 3 (3, 4, 5)
Sequence3 = from 7 amount 1 (7)
Sequence4 = from 12 amount 4 (12, 13, 14, 15)
Sequence5 = from 20 amount 1 (20)
Sequence6 = from 22 amount 1 (22)
Sequence7 = from 24 amount 1 (24)
Sequence8 = from 28 amount 3 (28, 29, 30)
Run Code Online (Sandbox Code Playgroud)

我知道如何使用for和检查每个数字.是否有更优雅的方式或算法,或一些sql/lambda命令可以帮助我?

Cod*_*aos 5

如果输入已排序,并且您确实想要避免foreach循环,则可以使用:

list.Select((value,index)=>new {value,index}).GroupBy(x=>x.value-x.index,x=>x.value).Select(g=>g.AsEnumerable())
Run Code Online (Sandbox Code Playgroud)

人们还可以编写一般的帮助方法:

public static IEnumerable<IEnumerable<T>> SplitBetween<T>(this IEnumerable<T> sequence, Func<T,T,bool> predicate)
{
  T previous=default(T);
  List<T> list=new List<T>();
  int index=0;
  foreach(T current in sequence)
  {
    if((index>0)&&predicate(previous,current))
    {
      yield return list.ToArray();
      list.Clear();
    }
    list.Add(current);
    previous=current;
    index++;
  }
  if(list.Count>0)
    yield return list.ToArray();
}
Run Code Online (Sandbox Code Playgroud)

然后用它 list.SplitBetween((previous,current) => previous+1 != current)