我正在使用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的范围?
答案 0 :(得分:6)
由于GetRange的签名不是GetRange(lower, upper)
,因此GetRange(index, count)
。请注意,错误消息涉及 offset 和 length 。
换句话说:它不会返回范围[y, x]
,而是从x
开始返回y
个元素。
要获取y
到x
的元素(包括y和x),请改用GetRange(y, y - x + 1)
。在您的情况下,那将是array.GetRange(y, array.Count - y)
。
PS:由于你的array
实际上不是数组,我建议你使用不同的变量名。