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

本文关键字:删除 元素 集合 对象 | 更新日期: 2023-09-27 18:02:03

这是我的代码c#

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

当我删除ee时,它导致它也从其他集合{TMPElementsX}中删除,我如何在TMPElementsX中保留ee的副本?我需要在另一个临时集合TMPElementsX

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

中保留ee对象的副本

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

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

当您执行TMPElementsX = TMPElements;时,您实际上分配了一个引用。

表示变量TMPElementsTMPElementsX都指向同一对象。使用这些变量删除一个对象将会影响这个对象。

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

如果您有值类型的List(如int, double等),则会容易得多。应该是这样的:

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上阅读一些文章来学习如何制作深度拷贝:

如何克隆c#中的泛型列表?
创建集合中所有元素的深度拷贝的泛型方法

在某些情况下,进行深度复制可能是一个糟糕的选择。这是一种hack,但不是解决方案。也许,您可以更改您的体系结构和逻辑以在没有它的情况下工作。