我知道这些问题已经提出并且已在此处回答: C# how to assign List<T> without being a reference?
但正如@Dev所说它仍然被引用。我的&#34; name_list1
&#34;是静态的然后我正在应对:
name_list2 = new List<string>(name_list1);
如上所述回答。我已经尝试了从stackoverflow建立的所有可能的解决方案,如:
使用 - AddRange
,ToList
,ToArray
和所有。但它仍然只在name_list1
创建ref。当我在name_list2
中更改对象值时,它也会在name_list1
中受到影响。
我需要再次提出这个问题,因为由于&lt; 50声誉,我无法对其他问题发表评论:P :(
答案 0 :(得分:3)
您需要遍历第一个列表,并克隆所有对象,然后将这些对象添加到list2。
否则,即使列表对象不同,它们引用的项目仍然相同,因此对列表项所做的任何更改都将通过其他列表反映出来。
请参阅此SO答案以了解如何克隆。 Deep cloning objects
另外,要理解的一个概念是,当您创建另一个列表并使用AddRange时,两个列表对象都不同。
对一个列表的更改不会反映在其他列表中。这些更改包括添加列表项,删除列表项,排序列表项
这些集合级别更改与单个列表项目中的更改不同,这些更改反映为两个列表中的各个列表项目仍然相同(除非在添加到列表之前克隆它们)。
答案 1 :(得分:1)
要简单解决这个问题,我手动添加了对象项的每个值。因为我也试图遍历每个对象以将其添加到列表中,并且这样做并不起作用。所以对我来说简单的解决方案是编写列表项对象的构造函数,它有一个接受自身对象类型的参数并手动添加所有值。我会在一段时间内做更多的事情来更好地解决这个问题。谢谢大家的帮助:)
我们也可以使用:
public static T DeepCopy<T>(T item)
{
BinaryFormatter formatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
formatter.Serialize(stream, item);
stream.Seek(0, SeekOrigin.Begin);
T result = (T)formatter.Deserialize(stream);
stream.Close();
return result;
}