myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Entwicklung (https://www.mycsharp.de/wbb2/board.php?boardid=3)
-- Grundlagen von C# (https://www.mycsharp.de/wbb2/board.php?boardid=88)
--- Aus Liste neue Liste erstellen (Clone) und nicht nur die Referenzen übernehmen (https://www.mycsharp.de/wbb2/thread.php?threadid=121414)


Geschrieben von GyrosMitVielScharf am 22.12.2018 um 14:57:
  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.

C#-Code:
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.


Geschrieben von Abt am 22.12.2018 um 15:02:
 
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


Geschrieben von Th69 am 22.12.2018 um 16:37:
 
Dann erzeuge eine neue Liste:

C#-Code:
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).


Geschrieben von GyrosMitVielScharf am 22.12.2018 um 16:47:
 
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.


Geschrieben von Abt am 22.12.2018 um 18:20:
 
Zitat von GyrosMitVielScharf:
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.

Zitat von GyrosMitVielScharf:
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.


Geschrieben von GyrosMitVielScharf am 22.12.2018 um 18:59:
 
Zitat:
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.


Geschrieben von GyrosMitVielScharf am 22.12.2018 um 19:22:
 
Zitat:
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.


Geschrieben von ThomasE. am 09.01.2019 um 14:31:
 
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


Geschrieben von GyrosMitVielScharf am 12.01.2019 um 21:59:
 
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.


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 16.12.2019 09:44