Sort的文檔說Sort會拋出一個ArgumentException,如果「比較器的實現在排序過程中導致錯誤,例如,比較項與自身時,比較器可能不會返回0。比較器什麼時候會進行排序拋出一個ArgumentException?
除了給出的例子,誰能告訴我什麼時候會發生這種情況?
Sort的文檔說Sort會拋出一個ArgumentException,如果「比較器的實現在排序過程中導致錯誤,例如,比較項與自身時,比較器可能不會返回0。比較器什麼時候會進行排序拋出一個ArgumentException?
除了給出的例子,誰能告訴我什麼時候會發生這種情況?
排序算法(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));
}
}
進一步說有點進入快速排序的實現,你會看到這樣的代碼:
while (comparer.Compare(keys[a], y) < 0)
{
a++;
}
while (comparer.Compare(y, keys[b]) < 0)
{
b--;
}
基本上,如果在的IComparer拋出一個IndexOutOfRangeException異常的Quicksort調用,該異常包裝在n個ArgumentException中。
這裏是一個壞的IComparer的
class Comparer: IComparer<int>
{
public int Compare(int x, int y)
{
return -1;
}
}
所以我想,簡單的答案是,任何時候你IComparer實現並不一致比較值,如文檔中定義的另一個例子:
比較兩個對象並返回一個 值,指示其中一個是否小於 ,等於或大於 其他。
我遇到了這個今天和調查後,我發現,有時候我比較器是被稱爲x和y是引用同一個對象,我的比較器沒有返回0。一旦我固定的,我停止了例外。
HTH,
埃裏克
謝謝 - 這幾乎是我多遠轉向SO之前進行的。原來的錯誤似乎是IndexOutOfRangeException。這與比較器的可預測性有什麼關係? – 2008-12-21 16:47:50
好的 - 我可以看到這可能是一個問題。謝謝! – 2008-12-21 16:56:39