C#:如何在while循环中排序临时列表而不影响原列表?
问题根源:引用类型的赋值逻辑
你遇到的问题核心在于Listvar 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
相关产品推荐
相关产品推荐

