C# 将列表复制到新列表仍会更改旧列表';s值
我已将一份清单纳入财产:C# 将列表复制到新列表仍会更改旧列表';s值,c#,.net,c#-3.0,C#,.net,C# 3.0,我已将一份清单纳入财产: public List<Pair> PairList {get;set;} 实际问题: 如果任何东西在newPairList中得到更新,它将自动在PairList中得到更新。如何防止主属性PairList无法更新?您的对类型是类。因此,在列表中存储对对的实例的引用 因此,如果您实例化一个对 Pair pair = new Pair(); 对有一个引用。如果将该引用添加到列表中 然后将此列表复制到另一个列表中 newPairList = new List&
public List<Pair> PairList {get;set;}
实际问题:
如果任何东西在newPairList中得到更新,它将自动在PairList中得到更新。如何防止主属性PairList无法更新?您的
对类型是类。因此,在列表中
存储对对的实例的引用
因此,如果您实例化一个对
Pair pair = new Pair();
对
有一个引用。如果将该引用添加到列表中
然后将此列表复制到另一个列表中
newPairList = new List<Pair>(PairList);
您的对
类型是类
。因此,在列表中
存储对对的实例的引用
因此,如果您实例化一个对
Pair pair = new Pair();
对
有一个引用。如果将该引用添加到列表中
然后将此列表复制到另一个列表中
newPairList = new List<Pair>(PairList);
创建新的Pair对象,例如通过提供返回它的DeepCopy
函数。然后您可以使用以下命令获取列表:list newPairList=PairList.Select(p=>p.DeepCopy()).ToList()代码>因为Pair是引用类型,所以新列表将包含对旧列表中引用所引用的相同对象的引用。如果第一个列表中的Pair类是新实例,那么您唯一能做的就是将这些实例克隆到新实例中,并用这些新实例填充第二个列表。@ZoharPeled您能提供一些代码吗。这将有助于lot@DirtyDeveloper看看你已经得到的答案。。。我开始写答案,但勒内·沃格特比我快。创建新的Pair对象,例如,通过提供一个返回它的DeepCopy
函数。然后您可以使用以下命令获取列表:list newPairList=PairList.Select(p=>p.DeepCopy()).ToList()代码>因为Pair是引用类型,所以新列表将包含对旧列表中引用所引用的相同对象的引用。如果第一个列表中的Pair类是新实例,那么您唯一能做的就是将这些实例克隆到新实例中,并用这些新实例填充第二个列表。@ZoharPeled您能提供一些代码吗。这将有助于lot@DirtyDeveloper看看你已经得到的答案。。。我刚开始写答案,但勒内·沃格特比我快。你的答案似乎很接近,但我有一个顾虑。在stringval也存在的类值处掠夺,我有两个diff构造函数的组合,并且该类对的添加来自第三方dll,我无法将接口实现Iclonable@DirtyDeveloper您不需要在这里实现iClonable。这种方法应该可以正常工作,而不需要对Pair
类进行任何更改。我删除了我的答案。@DirtyDeveloper正如kazem所说,IClonable是不必要的,您可以使用我在更新的答案中显示的一个构造函数。@RenéVogt我试图复制并粘贴您的代码,但它抛出了一个编译时错误:不包含接受0参数的构造函数。您的答案似乎已关闭,但我有一个问题。在stringval也存在的类值处掠夺,我有两个diff构造函数的组合,并且该类对的添加来自第三方dll,我无法将接口实现Iclonable@DirtyDeveloper您不需要在这里实现iClonable。这种方法应该可以正常工作,而不需要对Pair
类进行任何更改。我删除了我的答案。@DirtyDeveloper正如kazem所说,IClonable不是必需的,您可以使用我在更新的答案中显示的一个构造函数。@RenéVogt我试图复制并粘贴您的代码,但它引发了编译时错误:不包含带0个参数的构造函数
newPairList = new List<Pair>(PairList);
newPairList = PairList.Select(p => new Pair(p.key, p.intval) {
stringVal = p.stringVal,
ValType = p.ValType
}).ToList();