gpt4 book ai didi

.net - Comparer 什么时候会让 Sort 抛出 ArgumentException?

转载 作者:行者123 更新时间:2023-12-01 10:16:32 25 4
gpt4 key购买 nike

Sort 的文档表示如果“比较器的实现在排序过程中导致错误,Sort 将抛出 ArgumentException。例如,比较器在将项目与自身进行比较时可能不会返回 0。”

除了给出的例子,谁能告诉我什么时候会发生这种情况?

最佳答案

排序算法 (QuickSort) 依赖于可预测的 IComparer 实现。在 BCL 中进行了几十层间接寻址后,您最终得到了这个方法:

public void Sort(T[] keys, int index, int length, IComparer<T> comparer)
{
try
{
...
ArraySortHelper<T>.QuickSort(keys, index, index + (length - 1), comparer);

}
catch (IndexOutOfRangeException)
{
...
throw new ArgumentException(Environment.GetResourceString("Arg_BogusIComparer", values));
}
}

更深入地研究 QuickSort 实现,您会看到如下代码:

    while (comparer.Compare(keys[a], y) < 0)
{
a++;
}
while (comparer.Compare(y, keys[b]) < 0)
{
b--;
}

基本上,如果 IComparer 对 Quicksort 调用的行为不当并抛出 IndexOutOfRangeException,它包含在 n ArgumentException 中。

这是另一个错误的 IComparer 的例子

class Comparer: IComparer<int>
{
public int Compare(int x, int y)
{
return -1;
}
}

所以我想,简短的回答是,只要您的 IComparer 实现不始终如一地比较文档中定义的值:

Compares two objects and returns a value indicating whether one is less than, equal to or greater than the other.

关于.net - Comparer 什么时候会让 Sort 抛出 ArgumentException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/384632/

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