2008-12-21 77 views

回答

3

排序算法(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實現並不一致比較值,如文檔中定義的另一個例子:

比較兩個對象並返回一個 值,指示其中一個是否小於 ,等於或大於 其他。

+0

謝謝 - 這幾乎是我多遠轉向SO之前進行的。原來的錯誤似乎是IndexOutOfRangeException。這與比較器的可預測性有什麼關係? – 2008-12-21 16:47:50

+0

好的 - 我可以看到這可能是一個問題。謝謝! – 2008-12-21 16:56:39

2

我遇到了這個今天和調查後,我發現,有時候我比較器是被稱爲x和y是引用同一個對象,我的比較器沒有返回0。一旦我固定的,我停止了例外。

HTH,

埃裏克

相關問題