我想知道是否可以将一个列表中的对象添加到另一个列表中,如下所示:
objectToRemoveList.Add(listOfObjects.ElementAt(i));
然后,我想删除列表中的所有对象:
objectToRemoveList.Clear();
我想知道,因为好像物品还在那里!?
答案 0 :(得分:6)
那不行。让我以图解的方式解释它。你的对象存在于内存中:
a b c d
您的列表listOfObjects
仅包含对每个对象的引用:
listOfObjects: | | | |
| | | |
v v v v
a b c d
如果您将某些项目(例如b
和d
)添加到objectToRemoveList
,您也仅添加参考:
listOfObjects: | | | |
| | | |
v v v v
a b c d
^ ^
| |
objToRemoveLst: | |
通过执行objectToRemoveList.Clear
,您只需删除那里的所有引用。请注意listOfObjects
完全不受影响的方式:
listOfObjects: | | | |
| | | |
v v v v
a b c d
objToRemoveLst:
要实现您想要的目标,您可以使用以下循环:
foreach (object o in objectToRemoveList) {
listOfObjects.Remove(o);
}
这样,引用实际上已从listOfObjects
中删除,这正是您想要的:
listOfObjects: | |
| |
v v
a b c d
^ ^
| |
objToRemoveLst: | |
答案 1 :(得分:2)
当您将listOfObjects
中的元素添加到objectToRemoveList
时,您只是将对象的引用添加到您的列表中,而不是对象本身(除非您的列表是值类型,这不是'似乎是这样的)。因此,当您Clear()
其中一个列表时,另一个列表仍将包含原始项目,因为您没有修改它们。
答案 2 :(得分:2)
是的,原始列表中的对象将保持不变,因为您要在索引i处添加项目的引用。如果您有值类型,那么它将创建一个副本。
如果要从原始列表中的已知索引中删除项目,为什么不执行listOfObjects.RemoveAt(i)
?