静态列表ref在其副本上创建到其他列表。怎么避免?

时间:2015-01-13 05:20:29

标签: c# .net list

我知道这些问题已经提出并且已在此处回答: C# how to assign List<T> without being a reference?

但正如@Dev所说它仍然被引用。我的&#34; name_list1&#34;是静态的然后我正在应对:

name_list2 = new List<string>(name_list1);

如上所述回答。我已经尝试了从stackoverflow建立的所有可能的解决方案,如: 使用 - AddRangeToListToArray和所有。但它仍然只在name_list1创建ref。当我在name_list2中更改对象值时,它也会在name_list1中受到影响。

我需要再次提出这个问题,因为由于&lt; 50声誉,我无法对其他问题发表评论:P :(

2 个答案:

答案 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;
        }