List<Int32> dansConList = new List<Int32>();
dansConList[0] = 1;
dansConList[1] = 2;
dansConList[2] = 3;
List<Int32> dansRandomList = new List<Int32>();
dansRandomList[0] = 1;
dansRandomList[1] = 2;
dansRandomList[2] = 4;
Run Code Online (Sandbox Code Playgroud)
我需要一种方法,在评估上面的列表时,将返回falsefor dansRandomList和truefor,dansConList基于事实dansConList在其值中有一个连续的数字序列,而dansRandomList则没有(缺少值3).
如果可能,最好使用LINQ.
我试过的:
Raw*_*ing 48
单行,只迭代直到第一个非连续元素:
bool isConsecutive = !myIntList.Select((i,j) => i-j).Distinct().Skip(1).Any();
Run Code Online (Sandbox Code Playgroud)
更新:有关其工作原理的几个示例:
Input is { 5, 6, 7, 8 }
Select yields { (5-0=)5, (6-1=)5, (7-2=)5, (8-3=)5 }
Distinct yields { 5, (5 not distinct, 5 not distinct, 5 not distinct) }
Skip yields { (5 skipped, nothing left) }
Any returns false
Run Code Online (Sandbox Code Playgroud)
Input is { 1, 2, 6, 7 }
Select yields { (1-0=)1, (2-1=)1, (6-2=)4, (7-3=)4 } *
Distinct yields { 1, (1 not distinct,) 4, (4 not distinct) } *
Skip yields { (1 skipped,) 4 }
Any returns true
Run Code Online (Sandbox Code Playgroud)
*Select不会产生第二个4而Distinct不会检查它,因为Any会在找到第一个4之后停止.
var min = list.Min();
var max = list.Max();
var all = Enumerable.Range(min, max - min + 1);
return list.SequenceEqual(all);
Run Code Online (Sandbox Code Playgroud)
var result = list
.Zip(list.Skip(1), (l, r) => l + 1 == r)
.All(t => t);
Run Code Online (Sandbox Code Playgroud)
您可以使用此扩展方法:
public static bool IsConsecutive(this IEnumerable<int> ints )
{
//if (!ints.Any())
// return true; //Is empty consecutive?
// I think I prefer exception for empty list but I guess it depends
int start = ints.First();
return !ints.Where((x, i) => x != i+start).Any();
}
Run Code Online (Sandbox Code Playgroud)
像这样使用它:
[Test]
public void ConsecutiveTest()
{
var ints = new List<int> {1, 2, 4};
bool isConsecutive = ints.IsConsecutive();
}
Run Code Online (Sandbox Code Playgroud)