C# 如何检查IEnumerable是否已排序?
如何检查IEnumerable是否已排序C# 如何检查IEnumerable是否已排序?,c#,sorting,collections,C#,Sorting,Collections,如何检查IEnumerable是否已排序 bool IsSorted<T>(IEnumerable<T> enumerable) { ??? } 这种方法的一个例子是: static bool IsSorted<T>(IEnumerable<T> enumerable) where T : IComparable<T> { T prev = default(T); bool prevSet = false;
bool IsSorted<T>(IEnumerable<T> enumerable)
{
???
}
这种方法的一个例子是:
static bool IsSorted<T>(IEnumerable<T> enumerable) where T : IComparable<T> {
T prev = default(T);
bool prevSet = false;
foreach (var item in enumerable) {
if (prevSet && (prev == null || prev.CompareTo(item) > 0))
return false;
prev = item;
prevSet = true;
}
return true;
}
适用于大多数内置类型,如数字或字符串,因为它们实现了IComparable。只需检查每个项是否不少于前一项:
public static partial class EnumerableExtensions {
public static bool IsSorted<T>(this IEnumerable<T> source,
IComparer<T> comparer = null) {
if (null == source)
throw new ArgumentNullException("source");
if (null == comparer)
comparer = Comparer<T>.Default;
if (null == comparer)
throw new ArgumentException("No default comparer found.");
T prior = default(T);
bool first = true;
foreach (var item in source) {
if (!first && comparer.Compare(prior, item) > 0)
return false;
first = false;
prior = item;
}
return true;
}
}
这将检查升序或降序排序,而不仅仅是升序排序
enum SortOrder
{
Unknown = 0,
Ascending = 1,
Descending = 2
}
static bool IsSorted<T>(IEnumerable<T> enumerable)
{
var enumerator = enumerable.GetEnumerator();
// Empty Enumerable
if (!enumerator.MoveNext())
return true;
SortOrder order = SortOrder.None;
// First Item
var last = enumerator.Current;
while(enumerator.MoveNext())
{
var result = Comparer<T>.Default.Compare(last, enumerator.Current);
switch (order)
{
case SortOrder.Unknown:
if (result == 0)
break;
if(result == -1)
order = SortOrder.Ascending;
else
order = SortOrder.Descending;
break;
case SortOrder.Descending:
if (result == -1)
return false;
break;
case SortOrder.Ascending:
if (result == 1)
return false;
break;
}
last = enumerator.Current;
}
return true;
}
仅通过枚举它并确保所有项目都是有序的。为此,T应该实现IComparable.a定义排序的含义。b从第一个项目开始,检查它是否相对于下一个项目排序-如果是,检查下一个项目与n+1项目。继续,直到您发现一对不合顺序的退货为假或达到最终退货为真为止您尝试过什么吗?现在还不清楚您被困在哪里。您不需要在实现中将t限制为IComparable。@Evk:是的,您可以提供一个比较器;对于IComparable,可以使用Comparer.Default,这意味着编译代码不需要T:IComparable。不过,最好还是把它放在那个里,这样打电话的人就不能通过那个里的任何东西了。@Evk:我终于明白了;我应该在T:。。。