仅自定义类部分更新列表

时间:2015-05-07 11:56:56

标签: c# linq

我想(在一个循环中)将类实例添加到列表中但是在每次迭代时我只想更新该类的一个字段。这是我的插图示例:

        public class info
    {
        public string aninmalorhuman;
        public string type;
    }

        var temp = new info();
        var infolist = new List<info>();
        temp.aninmalorhuman = "animal";
        temp.type = "dog";
        infolist.Add(temp);
        temp.type = "cat";
        infolist.Add(temp);

如果我给控制台提供信息,它会打印出“动物猫”和“动物猫”。 “动物猫”。我想先学习为什么???第二,我如何打印“动物狗”&amp; “动物猫”好吗?

更新

我看到这不是最聪明的问题,但是我对初学者感到困惑,所以我真的不明白为什么这会被拒绝。无论如何,谢谢那些回复此事的人。

4 个答案:

答案 0 :(得分:2)

这是因为class是引用类型。所以基本上你是在堆上修改相同的内存。Good explanation of stack/heap 换句话说,在您的代码中,堆栈上有1个指针,指向同一块内存。 (一开始你在堆上有“狗”,然后你用“猫”替换“狗”)。

如果要插入新对象,则需要创建“Info Class”的新isntance

示例:

            var temp = new info();
            var infolist = new List<info>();
            temp.aninmalorhuman = "animal";
            temp.type = "dog";
            infolist.Add(temp);
            temp = new info();
            temp.aninmalorhuman = "animal";
            temp.type = "cat";
            infolist.Add(temp);

答案 1 :(得分:1)

您添加两次相同的对象(对象的相同引用)。

更改属性“type”的值时,也会更改列表中包含的值。

答案 2 :(得分:1)

你一直在使用同一个对象。创建一个新对象并将其添加到列表中

List<info> infolist = new List<info>();

info dog = new info(); //info object for the dog
dog.aninmalorhuman = "animal";
dog.type = "dog";
infolist.Add(dog);

info cat = new info(); //info object for the cat
cat.aninmalorhuman = "animal";
cat.type = "cat";
infolist.Add(cat);

答案 3 :(得分:0)

class更改为struct

public struct info
{
    public string aninmalorhuman;
    public string type;
}

如果要使用类,请实现ICloneable interface:

public class info : ICloneable
{
    public string aninmalorhuman;
    public string type;

    public info Clone()
    {
        return new info()
        {
            aninmalorhuman = this.aninmalorhuman,
            type = this.type,
        };
    }

    object ICloneable.Clone()
    {
        return Clone();
    }
}

var temp = new info();
var infolist = new List<info>();
temp.aninmalorhuman = "animal";
temp.type = "dog";
infolist.Add(temp);
temp = temp.Clone();
temp.type = "cat";
infolist.Add(temp);