首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查找序列号

查找序列号
EN

Stack Overflow用户
提问于 2011-12-02 21:36:49
回答 3查看 2K关注 0票数 1

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

我希望将它们按顺序分组,如下所示:

代码语言:javascript
复制
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)

我知道如何使用for和对每个数字进行检查。有没有更好的方法或者算法,或者一些sql/lambda命令可以帮助我?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-02 22:11:17

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

代码语言:javascript
复制
list.Select((value,index)=>new {value,index}).GroupBy(x=>x.value-x.index,x=>x.value).Select(g=>g.AsEnumerable())

你也可以写一个通用的助手方法:

代码语言:javascript
复制
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();
}

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

票数 5
EN

Stack Overflow用户

发布于 2011-12-02 22:03:04

我不认为这是非常“优雅”的,但这是我的建议,希望它能帮助你:

代码语言:javascript
复制
var list = new List<int> { 1, 3, 4, 5, 7, 12, 13, 14, 15, 20, 22, 24, 28, 29, 30 };

int offset = 0;
int sequence = 0;
do
{
    int offset1 = offset;
    var subList = list.Skip(offset).TakeWhile((item, index) => (index == 0) || (item == (list[offset1 + index - 1] + 1))).ToList();
    offset += subList.Count();
    sequence++;
    Debug.WriteLine("Sequence {0} from {1} amount {2} ({3})", sequence, subList[0], subList.Count(), string.Join(" ", subList));
}
while (offset < list.Count);
票数 3
EN

Stack Overflow用户

发布于 2011-12-02 22:39:34

代码语言:javascript
复制
int n = 12;//your number
int x = list.IndexOf(n);
var result = list.Skip(x).TakeWhile((value, index) => value - index == n);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8357149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档