【发布时间】:2018-08-07 06:18:33
【问题描述】:
我有这个扩展方法来检查任何类型的列表是否已排序
public static bool IsSorted<T>(this IEnumerable<T> input)
{
IEnumerable<T> expectedListASC = input.OrderBy(x => x);
IEnumerable<T> expectedListDESC = input.OrderByDescending(x => x);
return expectedListASC.SequenceEqual(input) || expectedListDESC.SequenceEqual(input);
}
但是对于大型列表,这需要时间。有没有更有效的方法来获得相同的结果?
【问题讨论】:
-
为什么不只枚举列表并检查后面的元素是否总是小于/大于前面的元素。它在时间上是线性的(如果未排序,您可以提前放弃检查) - 对于未排序的列表,它将接近 const time。
-
多次使用可枚举是 a) 不保证是可能的,b) 不保证是一致的。如果你想要solidly 通用的东西,你的起点不应该是
IEnumerable<T>。即使您更改代码以使用例如ToList()首先,无论您返回什么,您的调用者仍然存在这些问题。如果调用者需要排序的可枚举,只需让他们使用OrderBY并接受如果可枚举已经排序,它可能是多余的。 -
@FCin - 在我看来,这不是一个很好的重复 - 对于
ints 的非泛型数组,代码更容易,而且您不需要查找两种升序/降序。 -
“排序”和“按默认比较排序”不一定相同...另外,请考虑在计算其他任何内容之前先对
IOrderedEnumerable<T>进行类型检查。