更改列表中的对象

时间:2016-03-07 17:04:23

标签: c#

我有以下代码:

List<Foo> test = new List<Foo>();
test.Add(new Foo(2));
List<Foo> test2 = new List<Foo>();
test2.Add(test[0]);
test2[0] = new Foo(3);

当我将新对象分配给test2[0]时,test[0]更改。如何更改test[0]test2[0]

编辑:

好的,所以我已经有了两个对象。最后,我想将第一个对象更改为第二个对象。

Foo bar0 = new Foo(2);
Foo bar1 = new Foo(3);
List<Foo> test = new List<Foo>();
test.Add(bar0);
List<Foo> test2 = new List<Foo>();
test2.Add(test[0]);
// now what?

2 个答案:

答案 0 :(得分:1)

执行此操作时:

test2[0] = new Foo(3);

您没有在test2[0]修改对象,而是在修改test2。您正在进行的修改是您将新对象放在特定索引处。

这对以前的对象没有任何作用。也不应该。

如果要修改那里的对象,可以直接修改它:

test2[0].SomeProperty = someValue;

相反,如果您希望test2test成为相同的集合(以便修改其中一个也会修改另一个集合),那么将它们设为相同的集合:

List<Foo> test = new List<Foo>();
//...
List<Foo> test2 = test;

但只要testtest2是两个独立的实例,那么对一个实例的修改就不会反映在另一个实例中。同样,他们也不应该。

如果您想要这种行为(对一个实例的修改反映在另一个实例中),那么您可能必须创建自己的集合实现。这应该不是非常困难。只需创建一个继承自IList<T>的自定义类。在该类的实现中,您可以将集合的后备数据存储在static属性中。

我不确定可能有哪些其他副作用,因为我以前从未听说过想要这种行为。但至少一个static成员会反映出该班级所有实例的变化。

答案 1 :(得分:0)

它们是2个不同的列表,2个不同的实例,除非你这样做,否则你不能这样做:

test2 = test

你能解释为什么你需要按照你的方式完成它吗?