Ich verwende diese Routine, um einige Koordinaten in einen Container zu laden, sie zu zeichnen, hineinzuzoomen und diese Art von Aufgaben. Dann, bei einem Klick, tendiere ich dazu, Reset alles auf den ursprünglichen oder ursprünglichen Zustand. Dazu nehme ich eine Kopie der Initiale und spiele mit der Kopie. Aber wenn ich auf die Reset-Taste klicke, zerstöre ich die Kopie, nimm eine neue Kopie der Initiale und bearbeite sie. Und so weiter.Warum ändert sich der ursprüngliche Wert, wenn ich eine Kopie davon verarbeite?
Aus irgendeinem Grund ändert sich der ursprüngliche Container, wenn ich die Kopie ändere. Könnte jemand herausfinden, was ich falsch mache?
Um lade ich die Daten zuerst und eine Kopie nehmen:
// 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();
}
Beachten Sie, dass MyLoadedCoords
existiert nicht, wo im Code erwarten hier (und in der Reset-Funktion, nach unten). Dann bearbeite ich die Kopie MyDisplayedCoords
mehreren Stellen ähnlich wie diese:
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
}
}
Reset-Taste Ich tue dies:
public void ResetZoom()
{
MyDisplayedCoords = MyLoadedCoords.ToList(); // I set break point here
AdjustInitialDisplayPosition();
DrawImage();
}
ResetZoom()
nicht tut, was zu erwarten ist, wenn ich debuggen und brechen auf MyDisplayedCoords = MyLoadedCoords;
ich sehe, dass MyLoadedCoords
enthält exakt die gleichen Werte/Objekte wie MyDisplayedCoords
EDIT:
I umgesetzt IClonable
und "overrided" die Clone()
Funktion in meiner Klasse, aber es hat NICHT Arbeit:
public class CoordPoint : ICloneable
{
// ..
public object Clone()
{
return new CoordPoint {X = X, Y = Y, Z = Z, Color = Color};
}
}
jedoch mit aus den IClonable
, das "Kopieren" arbeitet als Klonen H.B antwortete:
MyDisplayedCoords = MyLoadedCoords.Select(c => new CoordPoint { X = c.X, Y = c.Y, Z = c.Z, Color = c.Color }).ToList();
Sie eine Kopie nicht bekommen, sind Sie tatsächlich Arbeiten an einer neuen Liste mit den gleichen Datenzeigern. Um dies zu beheben, müssen Sie entweder Klonen verwenden, das verschachtelte Referenztypen nicht unterstützt, oder Ihren eigenen Klon implementieren. – Phaeze
@FirstStep, CoordPoint, ist es Klasse oder Struktur? Denn wenn es sich um eine Klasse handelt, erstellt .ToList() eine neue Liste, die dieselben Referenzen enthält. –
@ArtavazdBalayan ist eine Klasse. Interessant, ich wusste das nicht, also wenn es eine Struktur wäre, hätte es funktionieren können? –