-1

我想知道是否可以像这样将一个列表中的对象添加到另一个列表中:

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

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

objectToRemoveList.Clear();

我想知道,因为对象似乎还在那里!?

4

3 回答 3

6

那是行不通的。让我以图形的方式解释它。您的对象存在于内存中的某处:

  a     b     c     d

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

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

如果您将其中一些项目(比如说band 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:       |           |
于 2012-07-18T18:05:28.370 回答
2

是的,原始列表中的对象将保持不变,因为您要在索引 i 处添加项目的引用。如果您有值类型,那么它将创建一个副本。

listOfObjects.RemoveAt(i)如果您想从原始列表中的已知索引中删除项目,为什么不这样做呢?

于 2012-07-18T18:08:17.993 回答
2

当您从listOfObjectsto添加元素时objectToRemoveList,您只是将对象的引用添加到您的列表中,而不是对象本身(除非您的列表是值类型,但情况似乎并非如此)。因此,当您使用Clear()其中一个列表时,另一个列表仍将包含原始项目,因为您没有修改它们。

于 2012-07-18T18:05:21.833 回答