更改列表中值的属性而不更改值本身

时间:2015-10-27 15:54:47

标签: c# winforms list properties

我有一个包含值的列表(这些是类Class1中的类型)。每个值都有一个Date属性。现在我正在尝试将一个元素添加到列表中:

 var entry = list.First();
            list.Add(entry);
            list.First().DateVal = new DateTime(list.First().DateVal.Value.Year,1,1); 

所以我正在复制元素并将属性DateVal更改为01.01.xxxx。会发生什么,它也将整个值更改为01.01.xxxx。两个值都会发生这种情况。例如:

值:05.10。物业:05.10.2015

之后我得到:

值:01.01。物业:01.01.2015 值:01.01。物业:01.01.2015

我想要的是:

值:05.10。物业:01.01.2015 价值:05.10。物业:05.10.2015

如何更改属性?我想知道为什么上面的代码不起作用。

1 个答案:

答案 0 :(得分:0)

这是否适用于更新新对象属性?

var original = list.First();
var newObject = new Class1(){
        DateVal = original.DateVal,
        //Set other properties
    };
    newObject.DateVal = new DateTime(newObject.DateVal.Value.Year, 1, 1);
    list.Add(newObject);

更改一个日期时两个日期都会发生变化的原因是您只是将同一个对象添加到列表中两次,而不是复制它。所以当你换一个时它会改变另一个。不确定您的预期输出是否是拼写错误但是它建议您希望单个对象上的值和属性具有不同的值,我假设值和属性不能不同,因为它们是相同的。在对象上使用MemberwiseClone()应克隆并解决在更新一个元素时更改其日期的两个元素的问题。此外,假设您要更改已创建的那个,那么在添加它之前更改它,而不是一次又一次地在列表中查找它。如果您想更改原件,请尝试以下操作:

var original = list.First();
var newObject = new Class1(){
        DateVal = original.DateVal,
        //Set other properties
    };
    original.DateVal = new DateTime(original.DateVal.Value.Year, 1, 1);
    list.Add(newObject);

这将克隆对象,然后更新原始内容,而无需再次查看列表。