我想出了一个非常LINQy的方法来做到这一点
bool isOrdered = ids.Skip(1).Concat(new List<int>() { int.MaxValue })
.Zip(ids, (y, x) => y >= x)
.All(z => z);
然而,它不是非常有效或紧凑。有没有更好的办法?
答案 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的解决方案是最好的。