Изменение свойства значения в списке без изменения самого значения

У меня есть список со значениями в нем (это типы из класса 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

Как просто изменить свойство? Мне интересно, почему приведенный выше код не работает.


person Community    schedule 27.10.2015    source источник
comment
Итак, вы берете первую запись в списке, добавляя ее, а затем хотите установить значение той, которую вы только что ввели?   -  person Dhunt    schedule 27.10.2015
comment
Да. Я копирую первый элемент, а затем хочу изменить свойство первого, но все значение изменяется. Я хочу сохранить оба элемента и просто изменить свойство Date первого на 1.1.xxxx.   -  person    schedule 27.10.2015
comment
Итак, я все еще не совсем уверен в том, что вы ищете. Вы хотите изменить оригинал или копию, или это не имеет значения? Также проблема в том, что когда вы меняете один, он меняет дату в обоих?   -  person Dhunt    schedule 27.10.2015
comment
Я описал это немного лучше. Надеюсь теперь понятно   -  person    schedule 27.10.2015
comment
Итак, глядя на это, вы хотите изменить свойство без изменения его значений, что невозможно, поскольку они напрямую зависят друг от друга. Откуда берутся ценности и ценности свойств? Не могли бы вы опубликовать код класса, который используется для объектов в списке? Кроме того, причина изменения обеих дат заключается в том, что вы дважды добавляете один и тот же объект в список, а не клонируете его.   -  person Dhunt    schedule 27.10.2015
comment
нам нужно больше деталей, можете ли вы дать нам код класса 1 (кстати, очень неясно, что это такое) и дать больше информации в целом?   -  person Fredou    schedule 27.10.2015
comment
Это немного сложно. Вся конструкция тоже сложная. Это свойство внутри класса, которое получает Date. Можно установить дату, введя год, месяц, день как целое число. Значит, это невозможно? Почему оба значения меняются, когда я просто меняю свойство первого?   -  person    schedule 27.10.2015
comment
@Jackson30 В своем ответе я указал два разных подхода для учета обновления исходного или нового объекта. Это лучшее, что я могу сделать с ограниченной информацией.   -  person Dhunt    schedule 27.10.2015


Ответы (1)


Это работает для обновления свойства новых объектов?

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);

Это клонирует объект, а затем обновляет оригинал, не просматривая список снова.

person Dhunt    schedule 27.10.2015
comment
Не удается получить доступ к защищенному методу MemberwiseClone здесь - хорошо, я должен сначала реализовать его. Я сделаю, а затем попробую еще раз - person ; 27.10.2015
comment
Мне нужно внедрить ICloneable в мой интерфейс. Разве это не клонирует каждое свойство и т. Д. Тогда? Например, первичные ключи и так далее? Не лучше ли создать новый объект и установить его свойства? - person ; 28.10.2015
comment
Вы можете создать новый объект и установить все свойства, это будет делать то же самое. Я отредактировал его, чтобы скопировать объект вручную - person Dhunt; 28.10.2015
comment
Что помогает! Большое спасибо! - person ; 28.10.2015