You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让归并排序调用外部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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:48:08