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

Ste*_*hen 0 c# arrays mergesort list

我正在使用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);
        ...
Run Code Online (Sandbox Code Playgroud)

此代码抛出以下异常:偏移量和长度超出数组的范围或计数大于从索引到源集合末尾的元素数.

这似乎相当简单.但事实并非如此.你看,调试这些时是值:

array.Count = 8

a1.Count = 4

x = 7

y = 5

a2 =空

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

Hei*_*nzi 6

因为GetRange的签名不是GetRange(lower, upper),所以GetRange(index, count).请注意,错误消息涉及偏移量长度.

换句话说:它不返回范围[y, x],它返回x从开始的元素y.

为了充分利用的元素y,以x(其中包括Y和X),使用GetRange(y, y - x + 1)来代替.在你的情况下,那将是array.GetRange(y, array.Count - y).

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