2017-01-02 89 views
0

我使用清单工作的一个合并排序算法,在C#中,我得到一个奇怪的错误。列表<T> .GetRange抛出参数异常

class SortingAlgorithms 
{ 
    public static List<int> mergeSort(List<int> array) 
    { 
     if (array.Count == 1) 
      return array; 

     List<int> a1 = array.GetRange(0, (int)array.Count/2); 
     int x = array.Count - 1; 
     int y = array.Count/2 + 1; 
     List<int> a2 = array.GetRange(y, x); 
     ... 

此代码抛出以下异常:偏移量和长度分别为出界为阵列或计数大于从索引元件的源集合的末尾的数量越大。

这看起来很直截了当。但事实并非如此。你看,在调试时这些是值:

array.Count = 8

a1.Count = 4

X = 7

Y = 5

A2 = NULL

我的问题:为什么我不能得到5 - 7的范围内有8个元素的数组?

+0

因为你正在试图让Y与X(7:5),而不是与Y的范围X? –

+0

不,我正在绑定范围Y(5)到X(7)。 – Stephen

回答

6

由于GetRange的签名不是GetRange(lower, upper),这是GetRange(index, count)。请注意,错误消息谈到偏移量长度

换句话说:它不返回的范围[y, x],则返回开始yx元件。

要从yx(包括y和x)中获取元素,请改为使用GetRange(y, y - x + 1)。在你的情况下,这将是array.GetRange(y, array.Count - y)

PS:由于您的array实际上不是一个数组,我建议你使用一个不同的变量名。

+0

好的。我现在明白,它不会返回一个子列表,而是整个列表从索引开始直到计数。感谢您的解释。但我真的不明白GetRange(y,array.Count - y)/ GetRange(5,3)是如何理解的。 – Stephen

+0

@Stephen:'GetRange(5,3)'表示:给我3个元素,从元素5开始,即'[element5,element6,element7]'。它类似于['String.Substring'](https://msdn.microsoft.com/en-us/library/aka44szs(v = vs.110).aspx)等方法。 – Heinzi