检查整数列表是否递增1

时间:2013-04-10 00:02:35

标签: c# linq list

LINQ是否有办法检查整数列表是否是“顺序” - 即1,2,3,4,5或14,15,16,17,18?

4 个答案:

答案 0 :(得分:19)

您可以通过Enumerable.Zip执行此操作:

bool sequential = values.Zip(values.Skip(1), (a,b) => (a+1) == b).All(x => x);

这可以通过获取每对值,并检查第二个值是否比第一个更多,并返回布尔值。如果所有对符合条件,则值是顺序的。


鉴于这是一个整数的列表,您可以使用以下方式更有效地执行此操作:

bool sequential = values.Skip(1).Select((v,i) => v == (values[i]+1)).All(v => v);

这仅适用于可以通过索引访问的序列。请注意,我们使用的是values[i],而不是values[i-1],因为Skip调用会有效地转移索引。

答案 1 :(得分:11)

bool isSequential = Enumerable.Range(values.Min(), values.Count())
                              .SequenceEqual(values);

答案 2 :(得分:2)

另一个选择是使用Aggregate仅迭代序列一次。

请注意,与Reed Copsey建议的All不同Aggregate在条件失败时不能停在中间位置......

var s = new int[] {3,4,5,6}.ToList();

var isSequential = s.Aggregate
  (
      new {PrevValue = 0, isFirst = true, Success = true} ,
      (acc, current) => 
          new {
                  PrevValue = current,
                  isFirst = false, 
                  Success = acc.Success && (acc.isFirst || (acc.PrevValue == current - 1))
               }
  )
  .Success;

Fancier版本将包含带有先前值的迭代器或将在“First and the rest”上拆分迭代器的特殊代码,允许为任何可枚举的单次迭代实现Reed的解决方案。

答案 3 :(得分:-1)

如果您已经知道列表中的数字是唯一,还有已排序,那么最简单的顺序检查就是

lst[lst.Count - 1] - lst[0] == lst.Count - 1

假设列表中至少有1个元素。

相关问题