静态列表引用是在将其复制到其他列表时创建的。如何避免?
static list ref is created on copy of it to other list. how to avoid?
我知道有人问了这个问题并且已经在这里回答了:
C# how to assign List<T> without being a reference?
但正如@Dev 所说,它仍在被引用。我的“name_list1
”是静态的,然后我正在应对:
name_list2 = new List<string>(name_list1);
如上文所述link。我已经尝试了从 Whosebug 建立的所有可能的解决方案,例如:
使用 - AddRange
、ToList
、ToArray
等等。但它仍然只为 name_list1
创建 ref。当我在 name_list2
中更改对象值时,它也在 name_list1
中受到影响。
我需要再次问这个问题,因为我无法对其他问题发表评论,因为 <50 声望:P :(
您需要遍历第一个列表,克隆所有对象,然后将它们添加到 list2。
否则,即使列表对象不同,它们引用的项目仍然相同,因此对列表项目所做的任何更改都将反映在其他列表中。
请参阅此 SO 答案了解如何克隆。 Deep cloning objects.
此外,需要理解的一个概念是,当您创建另一个列表并使用 AddRange 时,两个列表对象是不同的。
对一个列表的更改不会反映在其他列表中。这些更改包括添加列表项、删除列表项、排序列表项。
这些集合级别的更改不同于单个列表项的更改,反映为单个列表项在两个列表中仍然相同(除非它们在添加到列表之前被克隆)。
为了简单地解决这个问题,我手动添加了对象项的每个值。因为我还尝试遍历每个对象以将其添加到列表中,但这是行不通的。所以对我来说简单的解决方案是编写列表项对象的构造函数,它有一个参数接受自身的对象类型并手动添加所有值。我会在一段时间内做更多的事情来以更好的方式解决这个问题。感谢大家的帮助:)
而且我们还可以使用:
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;
}
我知道有人问了这个问题并且已经在这里回答了: C# how to assign List<T> without being a reference?
但正如@Dev 所说,它仍在被引用。我的“name_list1
”是静态的,然后我正在应对:
name_list2 = new List<string>(name_list1);
如上文所述link。我已经尝试了从 Whosebug 建立的所有可能的解决方案,例如:
使用 - AddRange
、ToList
、ToArray
等等。但它仍然只为 name_list1
创建 ref。当我在 name_list2
中更改对象值时,它也在 name_list1
中受到影响。
我需要再次问这个问题,因为我无法对其他问题发表评论,因为 <50 声望:P :(
您需要遍历第一个列表,克隆所有对象,然后将它们添加到 list2。
否则,即使列表对象不同,它们引用的项目仍然相同,因此对列表项目所做的任何更改都将反映在其他列表中。
请参阅此 SO 答案了解如何克隆。 Deep cloning objects.
此外,需要理解的一个概念是,当您创建另一个列表并使用 AddRange 时,两个列表对象是不同的。
对一个列表的更改不会反映在其他列表中。这些更改包括添加列表项、删除列表项、排序列表项。
这些集合级别的更改不同于单个列表项的更改,反映为单个列表项在两个列表中仍然相同(除非它们在添加到列表之前被克隆)。
为了简单地解决这个问题,我手动添加了对象项的每个值。因为我还尝试遍历每个对象以将其添加到列表中,但这是行不通的。所以对我来说简单的解决方案是编写列表项对象的构造函数,它有一个参数接受自身的对象类型并手动添加所有值。我会在一段时间内做更多的事情来以更好的方式解决这个问题。感谢大家的帮助:)
而且我们还可以使用:
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;
}