gpt4 book ai didi

c# - 识别 IEnumerable 是否已排序的方法

转载 作者:行者123 更新时间:2023-11-30 13:35:32 26 4
gpt4 key购买 nike

我有这个扩展方法来检查任何类型的列表是否已排序

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);
}

但是对于大型列表,这需要时间。是否有更有效的方法来获得相同的结果?

最佳答案

这是一个通用方法,它应该检测序列是按递增顺序还是递减顺序,然后检查集合的其余部分是否符合顺序。

没有经过全面测试,如果您决定使用它,您应该左右扔数据集并编写单元测试。

public static class CollectionExtensions
{
public static bool IsOrdered<T>(this IEnumerable<T> collection, IComparer<T> comparer = null)
{
comparer = comparer ?? Comparer<T>.Default;

bool? expectedToIncrease = null;
using (var enumerator = collection.GetEnumerator())
{
bool gotFirst = enumerator.MoveNext();
if (!gotFirst)
return true; // empty collection is ordered
var first = enumerator.Current;
T second = default(T);

while (expectedToIncrease is null)
{
bool gotSecond = enumerator.MoveNext();
if (!gotSecond)
return true; // only equal elements are ordered
second = enumerator.Current;

switch (comparer.Compare(first, second))
{
case int i when i < 0:
expectedToIncrease = false;
break;

case int i when i > 0:
expectedToIncrease = true;
break;
}

if (expectedToIncrease is null)
first = second; // prepare for next round
}

while (enumerator.MoveNext())
{
if (expectedToIncrease.GetValueOrDefault())
{
if (comparer.Compare(second, enumerator.Current) < 0)
return false;
}
else
{
if (comparer.Compare(second, enumerator.Current) > 0)
return false;
}
}

return true;
}
}
}

关于c# - 识别 IEnumerable 是否已排序的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51720028/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com