我正在使用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的范围?
发布于 2017-01-02 16:02:38
因为GetRange的签名不是GetRange(lower, upper),而是GetRange(index, count)。请注意,错误消息涉及偏移量和长度。
换句话说:它不返回范围[y, x],而是返回从y开始的x元素。
要将元素从y获取到x (包括y和x),请使用GetRange(y, y - x + 1)。在您的例子中,这将是array.GetRange(y, array.Count - y)。
PS:由于您的array实际上不是一个数组,我建议您使用不同的变量名。
https://stackoverflow.com/questions/41429863
复制相似问题