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

C#中修改赋值后的List为何会影响传入的原List?

问题原因与技术提示

问题原因

C#中的List<T>属于引用类型,而非值类型。当你执行arg_list1 = arg_list0时,并没有复制整个列表的数据,只是让arg_list1变量和arg_list0指向了内存中同一个列表实例。所以后续调用arg_list1.RemoveRange()时,本质上是在修改这个共享的列表实例,自然原传入的arg_list0也会同步发生变化。

技术解决提示

要让arg_list1成为独立于arg_list0的列表,需要创建原列表的副本,常用两种方式:

  • 使用List的构造函数直接复制元素:
    List<(DateTime pro_opentimes, double pro_opencost)> arg_list1 = new List<(DateTime pro_opentimes, double pro_opencost)>(arg_list0);
    
  • 借助LINQ的ToList()方法(需先引用System.Linq命名空间):
    var arg_list1 = arg_list0.ToList();
    

注:你的列表元素是值类型元组(DateTime和double都是值类型),以上浅拷贝方式就能让两个列表完全独立。如果列表元素是自定义类这类引用类型,还需要考虑深拷贝,但当前场景不需要。

代码修正示例

将原代码中赋值arg_list1的行替换为上述副本创建代码即可,修改后:

//创建原列表的独立副本,修改arg_list1不会影响arg_list0
List<(DateTime pro_opentimes, double pro_opencost)> arg_list1 = new List<(DateTime pro_opentimes, double pro_opencost)>(arg_list0);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 21:58:25