使用LINQ检查IEnumerable <int>是否有序的最紧凑方法是什么?

时间:2016-12-09 23:26:02

标签: c# algorithm linq

我想出了一个非常LINQy的方法来做到这一点

bool isOrdered = ids.Skip(1).Concat(new List<int>() { int.MaxValue })
       .Zip(ids, (y, x) => y >= x)
       .All(z => z);

然而,它不是非常有效或紧凑。有没有更好的办法?

3 个答案:

答案 0 :(得分:2)

Aggregate是一种行走序列并跟踪上一个项目的方法

(new int[]{1,2,3}).Aggregate(
   new { IsSorted = true, Previous = int.MinValue },
   (state, current) => new {
       IsSorted = (state.IsSorted && current > state.Previous), 
       Previous = current})
 .IsSorted

不幸的是Aggregate.Zip()解决方案无法提前停止,您可以像样本一样提前.All停止。

答案 1 :(得分:2)

    var isOrdered = ids.Zip(ids.Skip(1), (curr, next) => curr <= next).All(x => x);

答案 2 :(得分:0)

如果您愿意受到更多限制并假设您IEnumerable<int>而不是IList<int>您可以执行此操作,这可以让您提前退出:

ids.Skip(1).Select( (val,ix) => val >= ids.ElementAt(ix-1) ).All( x => x);

它可以用于任何可枚举但在ids不是IList的情况下它将是O(n ^ 2)。如果你需要这个以上任何IEnumerable而不是@AlexeiLevenkov的解决方案是最好的。