2015-07-10 23 views
1

这里是我的代码C#除去集合元素而引起的所有相关对象中移除/收藏

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

当我删除EE,它会导致也删除它从其他集合{TMPElementsX},我怎样才能保持ee的副本TMPElementsX。 我需要保持从EE对象的副本另一个临时集合这是TMPElementsX

+0

您在内存中只有一个列表。创建两个目录 列表 TMPElementsX =新名单(); List TMPElements = new List (); – CharithJ

+0

'TMPElementsX = TMPElements;'在此之后,这两个对象将指向相同的列表。尝试编写一个复制函数,只需复制列表的值并创建两个对象,而不是使用'='运算符。 – Darian

回答

1

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

你要做的集合的深层副本(克隆)。

This post can be useful

+0

错误方法Form1.DeepCopy (System.Collections.ObjectModel.ObservableCollection )的类型参数不能从使用情况中推断出来。尝试明确指定类型参数。 –

+0

@MikeBluer请你给我们更多关于那个错误的背景吗?您尝试过哪些解决方案?感谢 – gastonmancini

+0

我试图 私有静态的ObservableCollection deepcopy的(的ObservableCollection 列表) 其中T:ICloneable { 的ObservableCollection newList =新的ObservableCollection (); foreach(T rec in list) { newList.Add((T)rec.Clone()); } return newList; } http://stackoverflow.com/questions/2744750/generic-method-to-create-deep-copy-of-all-elements-in-a-collection –

1

当您执行TMPElementsX = TMPElements;,你居然分配的参考。

这意味着,两个变量TMPElements,并在同一对象TMPElementsX点。使用任何这些变量移除对象都会影响此对象。

如果你想要它是不同的和独立的List s具有相同的值,那么你可以克隆你的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上的一些文章来学习如何做一个深层副本:

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

在某些情况下,使深层副本可以是一个不错的选择。这有点破解,但不是解决方案。也许,你可以在没有它的情况下改变你的架构和逻辑。

+0

当我做一个深拷贝,我不能比较,如果集合存在,因为id改变与新的副本 –

+0

为什么没有像Collection.Copy()或Collection.Clone()等概念...使深复制 –

相关问题