检查一个整数列表是否加1

本文关键字:列表 是否 整数 一个 检查 | 更新日期: 2023-09-27 18:08:34

是否有一种方法,用LINQ来检查整数列表是否是"顺序的" -即1,2,3,4,5或14,15,16,17,18?

检查一个整数列表是否加1

可以通过Enumerable.Zip:

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

的工作原理是取每一对值,检查第二个值是否比第一个值大1,然后返回布尔值。如果所有对都符合条件,则值是连续的。


假设这是一个整数列表,使用

可以更有效地完成此操作:
bool sequential = values.Skip(1).Select((v,i) => v == (values[i]+1)).All(v => v);

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

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

另一个选择是使用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;

更高级的版本是使用携带先前值的迭代器,或者使用特殊的代码将迭代器拆分为"First and the rest",从而实现Reed的解决方案,只需对任何枚举对象进行一次迭代。

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

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

假设列表中至少有一个元素