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

List<T>.GetRange throws argument exception

我正在使用 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 的范围?

因为GetRange的签名不是GetRange(lower, upper),而是GetRange(index, count)。请注意,错误消息谈到 offsetlength.

换句话说:它不 return 范围 [y, x],它 returns x 个元素开始于 y.

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

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