List <t> .GetRange抛出参数异常

时间:2017-01-02 15:59:40

标签: c# arrays list mergesort

我正在使用List在c#中使用合并排序算法,我得到一个奇怪的错误。

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 =空

我的问题:为什么我不能在一个包含8个元素的数组中得到5-7的范围?

1 个答案:

答案 0 :(得分:6)

由于GetRange的签名不是GetRange(lower, upper),因此GetRange(index, count)。请注意,错误消息涉及 offset length

换句话说:它不会返回范围[y, x],而是从x开始返回y个元素。

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

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