如何让归并排序调用外部ListOrderID?解决上下文不存在错误
问题修复方案
1. 解决「ListOrderID不存在于当前上下文」的错误
ListOrderID是WriteToList类中的静态成员,必须通过类名+成员名的方式访问,不能直接写ListOrderID。修改MergeSorting方法中的访问方式:
// 错误写法 ListOrderID.DoMergeSort(); // 正确写法 WriteToList.ListOrderID.DoMergeSort();
2. 让归并排序支持List<int>类型
当前DoMergeSort仅支持int[],我们可以给MergeSorter类添加一个针对List<int>的扩展方法,同时复用原有的MergeSort逻辑:
public static class MergeSorter { // 保留原有的int[]扩展方法 public static void DoMergeSort(this int[] array) { var sortedArray = MergeSort(array); for (int i = 0; i < sortedArray.Length; i++) { array[i] = sortedArray[i]; } } // 添加List<int>的扩展方法 public static void DoMergeSort(this List<int> list) { var sortedArray = MergeSort(list.ToArray()); list.Clear(); list.AddRange(sortedArray); } // 修复原代码的递归bug private static int[] MergeSort(int[] array) { if (array.Length <= 1) return array; var left = new List<int>(); var right = new List<int>(); for (int i = 0; i < array.Length; i++) { if (i % 2 > 0) left.Add(array[i]); else right.Add(array[i]); } // 原代码错误:递归right时误用left.ToArray(),现在修正为right.ToArray() left = MergeSort(left.ToArray()).ToList(); right = MergeSort(right.ToArray()).ToList(); return Merge(left, right); } // 保留原有的Merge、NotEmpty、MoveValueFromSourceToResult方法 private static int[] Merge(List<int> left, List<int> right) { var result = new List<int>(); while (NotEmpty(left) && NotEmpty(right)) { if (left.First() <= right.First()) MoveValueFromSourceToResult(left, result); else MoveValueFromSourceToResult(right, result); } while (NotEmpty(left)) MoveValueFromSourceToResult(left, result); while (NotEmpty(right)) MoveValueFromSourceToResult(right, result); return result.ToArray(); } private static bool NotEmpty(List<int> list) { return list.Count > 0; } private static void MoveValueFromSourceToResult(List<int> list, List<int> result) { result.Add(list.First()); list.RemoveAt(0); } }
3. 替换控制台输出为ListBox显示
将静态的MergeSorting方法改为非静态(因为按钮点击事件属于窗体类的非静态成员,可直接访问窗体上的ListBox),修改后代码如下:
private void btnSort_Click(object sender, EventArgs e) { MergeSorting(); } private void MergeSorting() { // 调用扩展方法排序List<int> WriteToList.ListOrderID.DoMergeSort(); // 清空ListBox并添加排序后的结果 listBox1.Items.Clear(); foreach (int number in WriteToList.ListOrderID) { listBox1.Items.Add(number.ToString()); } }
关键修复点说明
- 静态成员访问:必须通过定义它的类名访问,否则会出现上下文错误。
- 归并排序bug修复:原代码中递归处理right时误用了left的数组,导致排序逻辑完全错误,必须修正为
MergeSort(right.ToArray())。 - List
扩展方法:通过将List转为数组排序,再将结果写回List,实现对List 的排序支持。
内容的提问来源于stack exchange,提问作者CluelessGuy
相关产品推荐
相关产品推荐

