如何解除列表<t>类</t>中的项目

时间:2014-03-05 17:53:00

标签: c# winforms list class

有人可以向我解释如何用新陈述打破链条吗?

让我澄清一下我正在谈论的链条。当我打电话给一个班级时,我会像这样使用NEW语句

Myclass x =new Myclass();

我的理解是这会创建一个新的Myclass空实例。现在纠正我,如果我错了,但有一个新的空实例,应该能够添加该类支持的数据吗?

我使用这一批并且在以这种方式添加数据之前认为上述情况是正确的

Myclass x =new Myclass();

//oldMyclass being old data that needs to be changed then 
//added back to the class as a new or duplicate entry  
x = oldMyclass[1]; 
//we change the data 
x.red= 0x54;
//we add it back 
oldMyclass.add(x); 

一切都很好,直到我们在添加后编辑数据说我们需要更改另一个值。 我们访问oldMyclass并选择正确的项目,说它的索引是2,但我们只想更改索引2的值

Myclass x =new Myclass();
x = oldMyclass[2]; 
x.red=soemvalue;
oldMyclass[2] = x; 

这将改变索引1和索引2的红色值。如何打破索引1和索引2之间的链?

我想我可能已经过度简化了这个问题让我知道。

感谢您提供任何信息。

编辑:这是我尝试的复制方法

public static Items.SavedItem Copy(Items.SavedItem old)
        {
            Items.SavedItem x = new Items.SavedItem();
            x.generator = old.generator;
            x.hireling_class = old.hireling_class;
            x.id = old.id;
            x.item_slot = old.item_slot;
            x.owner_entity_id = old.owner_entity_id;
            x.socket_id = old.socket_id;
            x.square_index = old.square_index;
            x.used_socket_count = old.used_socket_count;
            return x;
        }

1 个答案:

答案 0 :(得分:1)

所以,让我们说,为了论证,你有一个这样的类:

public MyClass
{
    public string Foo { get; set; }
}

你有一个集合

List<MyClass> myList = new List<MyClass>();

现在您创建一个MyClass

的实例
MyClass obj1 = new MyClass() { Foo = "bar" };

现在,如果你这样做:

myList.Add(obj1);
myList.Add(obj1);

您现在有一个包含两个成员的列表,但它们碰巧是相同的对象。存储在列表中的是对您添加的对象的引用,而不是对象本身。所以myList[0] == myList[1]

现在,如果你这样做了:

MyClass item = myList[1];

然后:

item.Foo = "something else";

索引1处的项目和索引0处的项目都将具有'Foo ==“其他”“因为它们相同的项目

另一点似乎令你感到困惑的是:myList有两个项目。如果我这样做:

MyClass item = myList[0];

myList 仍然有两个项目。索引集合不会将其删除,因此,无需将项目添加回列表。它已经存在了。我所做的就是将引用myList复制到名为item的变量。

有一些集合(例如StackQueue)可以根据您删除项目并(可能)将其添加回来的原则工作,但List不起作用那样。

因此,如果要向myList添加多个对象,则需要使用new关键字创建多个对象。例如:

List<MyClass> myList = new List<MyClass>();
MyClass obj1 = new MyClass() { Foo = "bar" };
myList.Add(obj1);
obj1 = new MyClass() { Foo = "something else" };    // Note: I've reused the variable, but this is a *new* object
myList.Add(obj1);

或者,如果您不需要将新对象分配给变量,则可以简单地:

List<MyClass> myList = new List<MyClass>();
myList.Add(new MyClass() { Foo = "a" });
myList.Add(new MyClass() { Foo = "b" });

或者更紧凑一点,您可以利用集合初始化语法并简单地:

List<MyClass> myList = new List<MyClass>() 
{
    new MyClass() { Foo = "a" },
    new MyClass() { Foo = "b" }
}

如果要从列表中复制对象,则需要复制每个属性(如果它包含其他对象,则可能还需要复制它们)。有多种方法可以做到这一点,IClonable或复制构造函数是示例,但它基本上归结为,在某些时候,做这样的事情:

myCopy.Foo = myOriginal.Foo;
myCopy.Bar = myOriginal.Bar;
// repeat for all properties that you want to copy.

现在假设FooBar也不是引用类型,您有一份副本。如果它们是引用类型,则表示您有副本,但myCopy.FoomyOriginal.Foo仍指向同一对象。