Я использую эту процедуру для загрузки некоторых координат в контейнер, рисования их, увеличения их и подобных задач. Затем при нажатии кнопки я склонен к Сбросить все в исходное или исходное состояние. Для этого я беру копию оригинала и играю с копией. Но на кнопке Reset нажмите, я уничтожу копию, возьму новую копию исходного и обработаю ее. И так далее.Почему первоначальное значение изменяется, если я обрабатываю его копию?
По какой-то причине первоначальный контейнер изменяется при изменении копии. Может ли кто-нибудь определить, что я делаю неправильно?
Для того, я загружаю данные первого и взять копию:
// CoordPoint is a simple xy point
public List<CoordPoint> MyLoadedCoords { get { return myLoadedCoords; } set { myLoadedCoords = value; }}
public List<CoordPoint> MyDisplayedCoords { get { return myDisplayedCoords; } set { myDisplayedCoords = value }}
private List<CoordPoint> myLoadedCoords;
private List<CoordPoint> myDisplayedCoords;
//..
public void LoadData()
{
// load points from file
MyLoadedCoords = File.ReadLines("C:\\...\\Samples.txt")
// get a copy of original coords
MyDisplayedCoords = MyLoadedCoords.ToList();
}
Обратите внимание, что MyLoadedCoords
существует не где в коде ожидать здесь (и в функции сброса, вниз). Затем я обрабатываю Копируйте MyDisplayedCoords
несколько мест, похожее на это:
public void UpdateDisplayPosition()
{
for (var i = 0; i < MyDisplayedCoords.Count; i++)
{
MyDisplayedCoords[i].X += XCoordOffset; //some processed values
MyDisplayedCoords[i].Y += YCoordOffset; //some processed values
}
}
Кнопка сброса Я делаю это:
public void ResetZoom()
{
MyDisplayedCoords = MyLoadedCoords.ToList(); // I set break point here
AdjustInitialDisplayPosition();
DrawImage();
}
ResetZoom()
не делать то, что, как ожидается, когда я отладки и разорвать на MyDisplayedCoords = MyLoadedCoords;
я вижу, что MyLoadedCoords
содержит те же самые значения/объекты как MyDisplayedCoords
РЕДАКТИРОВАТЬ:
Я реализовал IClonable
и «перекрытая» функцию Clone()
в моем классе, но это было НЕ работы:
public class CoordPoint : ICloneable
{
// ..
public object Clone()
{
return new CoordPoint {X = X, Y = Y, Z = Z, Color = Color};
}
}
Однако, с из в IClonable
, это «копирование» работает как клонирование, как H.B ответил:
MyDisplayedCoords = MyLoadedCoords.Select(c => new CoordPoint { X = c.X, Y = c.Y, Z = c.Z, Color = c.Color }).ToList();
Вы не получаете копию, вы на самом деле работая над новым списком со всеми теми же указателями данных. Чтобы решить эту проблему, вам нужно либо использовать Clone, который не поддерживает вложенные ссылочные типы, а реализовать собственный глубокий клон. – Phaeze
@FirstStep, CoordPoint, это класс или структура? Потому что если это класс, .ToList() создаст новый список, который будет содержать те же ссылки. –
@ArtavazdBalayan это класс. Интересно, что я этого не знал, поэтому, если бы это была структура, это могло бы сработать? –