Laden...

Aus Liste neue Liste erstellen (Clone) und nicht nur die Referenzen übernehmen

Erstellt von GyrosMitVielScharf vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.593 Views
G
GyrosMitVielScharf Themenstarter:in
14 Beiträge seit 2017
vor 5 Jahren
Aus Liste neue Liste erstellen (Clone) und nicht nur die Referenzen übernehmen

Hallo,

Ich habe zu meinem Problem leider nichts im Internet gefunden.
Entweder benutze ich die falschen Suchbegriffe oder aber das Problem existert nur in meinem Kopf...

Ich füge einer (für mich im Code) permanenten Liste von Listen den Inhalt einer (für mich im Code) temporären Liste hinzu. ListA.Add(ListB).

Danach leere ich die temporäre Liste mittels ListB.Clear().
Und die Elemente in der anderen Liste sind auch weg.
Womit sie nicht permanent ist.

Wie kann ich dieser Liste Elemente zuweisen, die fest darin verbleiben, egal was ich anschließend mit der temporären Liste anstelle?

Ich möchte also keine Verweise haben, sondern eigenständige Objekte.

 print(l_CurrentChanges.generation.Count); // -> 5

      classGeneration newGen = new classGeneration();
      newGen = l_CurrentChanges;
       
      l_UndoList.Add( newGen );
      l_CurrentChanges.generation.Clear();

      print(l_UndoList[l_UndoList.Count-1].generation.Count); // -> 0

Wie kann ich dieses Problem lösen?

Vielen Dank in voraus für Ihre Hilfe.

16.806 Beiträge seit 2008
vor 5 Jahren

Erklär doch mal, was Du eigentlich vor hast.
Riecht etwas danach, dass das Design und Vorgehen an für sich suboptimal ist...

Es ist immer sinnvoller die Ursache eines Problems zu lösen, statt die nur die Symptome.
PS: bitte beachte [Hinweis] Wie poste ich richtig? und verwende Code Tags

4.931 Beiträge seit 2008
vor 5 Jahren

Dann erzeuge eine neue Liste:


var list = new List<X>(l_CurrentChanges); // für X passenden Datentyp einsetzen

// oder mittels LINQ
var list = l_CurrentChanges.ToList();

und füge diese der UndoList hinzu.

PS: Bitte benutze die Code-Tags (du kannst deinen Beitrag editieren).

G
GyrosMitVielScharf Themenstarter:in
14 Beiträge seit 2017
vor 5 Jahren

Sie haben recht, mein Vorgehen ist, euphemistisch formuliert, suboptimal...

Ich füge die Daten jetzt direkt in die jeweils instanziierte Zielliste ein.

Manchmal ist man im Denken völlig vernagelt.
Solange es nur zeitweilig auftritt und man darauf hingewiesen wird sollte es vertretbar sein.

Danke sehr für den Schubser in diese Richtung.

Kann man generell davon ausgehen, etwas beim Design missachtet oder missverstanden zu haben, wenn ein solcher Fall wie der meinige Auftritt?
MS arbeitet ja erst seit mehr als fünfzehn Jahren an C#, die haben bestimmt noch nicht alles relevante bedacht...

Ich bin langjähriger C++-Programmierer, vielleicht liegt es daran.

Vielen Dank für Ihre schnelle Hilfe.

Werde jetzt meinen Code ändern, besser noch, neu erstellen.

16.806 Beiträge seit 2008
vor 5 Jahren

MS arbeitet ja erst seit mehr als fünfzehn Jahren an C#, die haben bestimmt noch nicht alles relevante bedacht...

Die Wahrscheinlichkeit, dass Dein Konzept suboptimal ist, ist wahrscheinlicher, als dass die Designer hinter C# "was vergessen" haben.
C# ist eine sehr sehr erwachsene Sprache, die durchaus auch Konzepte besitzt, die in zeitlich älteren Sprachen schmerzlich fehlen.
Das Alter einer Sprache hat nichts direkt mit ihrer Reifheit zutun.

Kann man generell davon ausgehen, etwas beim Design missachtet oder missverstanden zu haben, wenn ein solcher Fall wie der meinige Auftritt?

Es gibt durchaus Szenarien, bei denen Objekte zu kopieren sinnvoll sein kann; 99,9% der Wünsche Objekte zu kopieren sind aber Designfehler.

G
GyrosMitVielScharf Themenstarter:in
14 Beiträge seit 2017
vor 5 Jahren

Die Wahrscheinlichkeit, dass Dein Konzept suboptimal ist, ist wahrscheinlicher, als dass die Designer hinter C# "was vergessen" haben.

Ich wollte meine Aussage zusätzlich zu den drei . am Satzende als Ironie kennzeichnen, mein Fehler...

Ich schätze C# sehr.
Mir ging es bei der Erwähnung von C++ um dessen explizite Anwendung/Kennzeichnung von Referenzen - Pointern - als solche, was ich manchmal vermisse.
Andererseits kann ich auf das Pointer-Gewusel liebend gerne verzichten.
Das sollte kein C#-Bashing werden.

G
GyrosMitVielScharf Themenstarter:in
14 Beiträge seit 2017
vor 5 Jahren

Dann erzeuge eine neue Liste

Das tat ich ja mit dem hier beklagten Resultat.

Ich erzeuge die Liste nun direkt in der Ziel-Listen-Liste ohne Zwischenliste.

Ich denke, ich brauche mehr Listen.

T
461 Beiträge seit 2013
vor 5 Jahren

Ein Listenfanatiker 😉

Also wenn du eine Liste mit Objekte hast und alle oder bestimmte Objekte in einer anderen Liste ebenfalls eintragen möchtest (selbige Objekt-Instanzen), dann muß die 2te Liste natürlich wie schon gesagt ebenfalls mit new initiieren und nicht einfach die vorhandene der neuen 2ten zugeweisen.

Somit müßtest du 2 versch. List-Instanzen besitzen.

Sollten jetzt trotzdem Einträge beim Clear der temporären aus der permanenten Liste verschwinden, so hast du sicher einen Bug drinnen.

Wenn du deinen Code preis gibts, kann man eher was erkennen...

Grüße

Ich habe den Titel mal angepasst, so dass Suchende auch etwas damit anfangen können. EDIT: Ich sollte beim Wort "Shift" im Titel das "f" nicht vergessen... 😄

G
GyrosMitVielScharf Themenstarter:in
14 Beiträge seit 2017
vor 5 Jahren

Guten Abend,

Vor dem Zubettgehen erstelle ich mir eine Liste, welche Listen ich am folgenden Tag erstellen muss...

Ich habe das beschriebene Problem in den Griff bekommen und gelöst.

Es war ein Verständnisfehler/eine Unlogik meinerseits, eine unnötige separate Liste zu führen nebst einem Abrutschen in Gewohnheiten aus seligen C++-Zeiten.

Ich bin - warum auch immer - fälschlicherweise davon ausgegangen, dass in C# eine Objektzuweisung ein Kopieren zufolge hat und keine Referenz auf das ursprüngliche Objekt.

Jetzt funktioniert alles wie gewünscht.

Danke für Ihre Antwort.