【问题标题】:List<T>.GetRange throws argument exception [duplicate]List<T>.GetRange 引发参数异常 [重复]
【发布时间】:2017-01-02 15:59:40
【问题描述】:

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

【问题讨论】:

  • 因为您试图获取 Y 到 X(7 到 5)的范围,而不是 X 到 Y?
  • 没有。我想得到 Y(5) 到 X(7) 的范围。

标签: c# arrays list mergesort


【解决方案1】:

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

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

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

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

【讨论】:

  • 好的。我现在明白它不会返回子列表,而是从索引开始直到计数的整个列表。谢谢你的解释。但我真的不明白 GetRange(y, array.Count - y) / GetRange(5, 3) 有什么意义。
  • @Stephen: GetRange(5, 3) 意思是:给我 3 个元素,从元素 5 开始,即[element5, element6, element7]。类似于String.Substring等方法。
猜你喜欢
  • 2012-02-28
  • 2020-12-30
  • 1970-01-01
  • 2012-02-20
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
相关资源
最近更新 更多