将对象添加到另一个列表?

时间:2012-07-18 18:00:35

标签: c#

我想知道是否可以将一个列表中的对象添加到另一个列表中,如下所示:

objectToRemoveList.Add(listOfObjects.ElementAt(i));

然后,我想删除列表中的所有对象:

objectToRemoveList.Clear();

我想知道,因为好像物品还在那里!?

3 个答案:

答案 0 :(得分:6)

那不行。让我以图解的方式解释它。你的对象存在于内存中:

  a     b     c     d

您的列表listOfObjects仅包含对每个对象的引用

listOfObjects:  |     |     |     |     
                |     |     |     |     
                v     v     v     v     
                a     b     c     d

如果您将某些项目(例如bd)添加到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)