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

C#:如何在while循环中排序临时列表而不影响原列表?

问题根源:引用类型的赋值逻辑

你遇到的问题核心在于List是引用类型,var temp = a;这行代码根本没复制列表的元素,只是让temp变量和a变量指向了内存中同一个List对象。所以你调用temp.Sort()的时候,本质上就是在给原列表a排序,自然两个列表看起来都被改动了。

先修正你代码里的一个语法错误,方法定义应该是:

public static int sortedSum(List<int> a)

要实现“复制原列表到临时列表,两者独立操作”,你需要创建一个新的List对象并复制原列表的元素,常用的两种方式:

  • 用List的构造函数:
    var temp = new List<int>(a);
    
  • 用LINQ的ToList()扩展方法(需要引用System.Linq):
    var temp = a.ToList();
    

这两种方式都会在内存中生成一个全新的列表,把原列表a的元素复制进去,此时排序temp就不会影响原列表a了。

你提到的“转int数组排序”能解决问题,是因为a.ToArray()会创建一个新的数组对象并复制元素,操作这个新数组不会关联到原列表a。

修正后的完整代码示例:

public static int sortedSum(List<int> a)
{
    int ans = 0;
    while (a.Count > 0)
    {
        var temp = new List<int>(a); // 真正复制列表元素
        temp.Sort();

        for (int i = 0; i < a.Count; i++)
        {
            ans += temp[i] * (i + 1);
        }
        a.RemoveAt(a.Count - 1);
    }
    return ans;
}

内容的提问来源于stack exchange,提问作者SpikeCoder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:31:42