从集合中删除元素导致从所有相关对象/集合中删除它

时间:2015-07-10 03:57:45

标签: c#

这是我的代码c#

 List<Element> TMPElementsX = new List<Element>();
 TMPElementsX = TMPElements;
 ResultsElements.Add(TMPElementsX);
 Element ee = element;
 TMPElements.Remove(ee);

当我删除ee时,它也会将其从其他集合{TMPElementsX}中删除,如何在 TMPElementsX 中保留ee的副本。 我需要在另一个临时集合中保留ee对象的副本,该集合是 TMPElementsX

2 个答案:

答案 0 :(得分:1)

问题是对象指向相同的内存位置,因此如果从其中一个集合中删除它将从另一个集合中删除。

您必须对集合进行深层复制(克隆)。

This post can be useful

答案 1 :(得分:1)

执行TMPElementsX = TMPElements;时,实际上是指定了参考。

这意味着变量TMPElementsTMPElementsX都指向同一个对象。使用任何这些变量删除对象都会影响此对象。

如果您希望它具有相同且不同的独立List,则可以克隆您的List

如果您拥有List值类型(例如intdouble等)会更容易。就是这样:

List<int> TMPElementsX = new List<int>();
TMPElementsX = new List<int>(TMPElements); // new list created
ResultsElements.Add(TMPElementsX);
int ee = element;
TMPElements.Remove(ee);

但是,如果引用类型,复制构造函数会使用相同引用的项创建列表。您需要制作List的深层副本。您可以在StackOverflow上阅读一些文章,以了解如何制作深层副本:

How do I clone a generic list in C#?
Generic method to create deep copy of all elements in a collection

在某些情况下,制作深层副本可能是一个糟糕的选择。它是一种黑客攻击,但不是解决方案。也许,你可以在没有它的情况下改变你的架构和逻辑。