Laden...

[gelöst] List<T> - Element ersetzen

Erstellt von andreas-82 vor 15 Jahren Letzter Beitrag vor 15 Jahren 5.797 Views
andreas-82 Themenstarter:in
42 Beiträge seit 2006
vor 15 Jahren
[gelöst] List<T> - Element ersetzen

Ich glaub ich hab gerade ein Brett vorm Kopf oder so:
Eigentlich doch simple Sache:

Das Problem ist, über eine Referenz eines Objektes einer List<T>, diesem Listenobjekt ein anderes Objekt zuzuweisen.

Hier ein abstraktes Beispiel:


  class CKonto
  {
    public CKonto(int Guthaben)
    {
      this.Guthaben = Guthaben;
    }

    public int Guthaben = 10;
  }

List<CKonto> listKonten = new List<CKonto>();

    private void Form1_Load(object sender, EventArgs e)
    {
      listKonten.Add(new CKonto(20));
      listKonten.Add(new CKonto(30));
      listKonten.Add(new CKonto(14));
    }

    private void cmdRefVeraendern_Click(object sender, EventArgs e)
    {
      // Referenz aus Listeneintrag holen
      CKonto ReferenzKonto = listKonten[1];

      // Neues Objekt CKonto mit anderen Eigenschaften erstellen
      CKonto GanzNeuesKonto = new CKonto(4);

      // Hier möchte ich die Referenz aus der Liste mit meinem neuen
      // Objekt 'überschreiben'
      ReferenzKonto = GanzNeuesKonto; // Geht nicht

    }

Ich denke das der Referenz 'ReferenzKonto' so eine neue Referenz und zwar die von 'GanzNeuesKonto' zugewiesen wird.
Ich müsste hier (wenn ich ich nur die Referenz der Liste habe, nicht aber den Index) sonst alle Eigenschaften einzeln ersetzen, das würde gehen, macht aber keiner: 🤔


      ReferenzKonto.Guthaben = GanzNeuesKonto.Guthaben;

Vielleicht Fragt ihr euch 'warum so umständlich' 😁
Es geht um einen Fragebogendesigner (CFormular, darin List<CSeite>, darin List<CBasisElem> (abstrakt)).

Wenn ich im Designer auf meine Formularseite klicke, bekomme ich eine Referenz auf das Objekt das ich getroffen habe zurück.
Diese übergebe ich im Konstruktor einem Eigenschaften Dialog wo man die Objekteigenschaften verändern kann.
Zurück bekomme ich ein neues Objekt, welches das andere ersetzen soll.

~ There's no knowledge that is not power~

N
335 Beiträge seit 2006
vor 15 Jahren

Hallo andreas-82,

Suchst du vielleicht:

CKonto zuErsetzendesKonto = /* .. */;
List<CKonto> kontoListe = new List<CKonto>();

CKonto neuesKonto = EigenschaftsDialogAufrufen(zuErsetzendesKonto);

int index = kontoListe.IndexOf(zuErsetzendesKonto;
kontoListe[index] = neuesKonto;

// In deinem Beispielcode:
listKonten[1] = GanzNeuesKonto;

Mfg NeuroCoder

PS: Verwende Properties statt öffentlicher Membervariablen.

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo andreas-82,

du musst zwischen Objekten und Variablen trennen. Das Zuweisen einer Referenz ändert immer nur die Variable, an die zugewiesen wird und zwar derart, dass sie die neu zugewiesene Referenz enthält. Anderer Variablen (also insbesondere die Liste und deren Elemente) ändern sich dadurch natürlich nicht und zwar ganz unabhängig davon, ob sie vorher auf dasselbe Objekt referenziert haben oder nicht. Alle in Variablen gespeicherten Referenzen auf ein und dasselbe Objekt sind vollkommen unabhängig voneinander.

Mit ReferenzKonto = GanzNeuesKonto; wird nur die Variable ReferenzKonto geändert. Beide Variablen verweisen nachher auf dasselbe Objekt, nämlich auf das Objekt, auf das vorher schon GanzNeuesKonto verwiesen hat.

Wenn du den Verweis in der Liste ändern willst, dann musst du auch dorthin zuweisen. So wie NeuroCoder das schon geschrieben hat: `listKonten_ = GanzNeuesKonto;[/tt]. Nötigenfalls musst du dir den passenden Index eben vorher heraussuchen.

herbivore

andreas-82 Themenstarter:in
42 Beiträge seit 2006
vor 15 Jahren

Hi,
danke vielmals für eure Antworten 🙂

Suchst du vielleicht:
...
int index = kontoListe.IndexOf(zuErsetzendesKonto);
...

Ganz genau das hab ich gesucht! Danke! =)
Konnte mir irgendwie nicht vorstellen die es die Indexsuche eines Listenelementes anhand einer vorhandenen Referenz auf das zu suchende Objekt nicht schon fertig gibt... hätte ich auch selber finden müssen 😜

PS: Verwende Properties statt öffentlicher Membervariablen.

Mach ich doch sonst, ist doch nur ein Bsp.code gewesen 😭

@herbivore, schöne Erklärung, danke 🙂

Für den den's interessiert, so hab ich's eingebaut:

void frmHauptMouseDown(object sender, MouseEventArgs e)
    {
      Designer.tmpMouseX = e.X;
      Designer.tmpMouseY = e.Y;

      //+-------------------------------------------------------------------------------------------
      //| Wenn ein Objekt getroffen wird, wird in 'VerschiebenKlick' dessen Referenz in das Feld
      //| Designer.MarkiertesObjekt übertragen um zu kennzeichnen,
      //| dass verschoben werden soll, solange 'MarkiertesObjekt!=null'
      //| Eine Referenz des getroffenen Objektes wird zurückgegeben.
      //+-------------------------------------------------------------------------------------------
       CBasisElem BasisElemGetroffen = Designer.VerschiebenKlick(e.X, e.Y);

      //+-------------------------------------------------------------------------------------------
      //| Spezialfall rechte Maustaste:
      //| Hier soll kein Verschieben möglich sein, sondern je nach Element das
      //| Eigenschaftenfenster geöffnet werden
      //+-------------------------------------------------------------------------------------------
       if (e.Button == MouseButtons.Right)
       {
         Designer.MarkiertesObjekt = null; // Verschieben beenden

         if (BasisElemGetroffen is CFrage)
         {
           // Das Eigenschaftenfenster wird referenziert und die getroffene Frage
           // übergeben, damit die aktuellen Werte in die Steuerelemente geladen werden
           // können.
           DLGNeueFrage tmpDialog = new DLGNeueFrage((CFrage)BasisElemGetroffen);
           tmpDialog.ShowDialog();
           if (tmpDialog.Frage != null) // Wird auf Speichern geklickt
           {
             int index = Designer.Formular.ListSeiten[0].ListBasisElems.IndexOf(BasisElemGetroffen);
             Designer.Formular.ListSeiten[0].ListBasisElems[index] = tmpDialog.Frage;
           }
         }

       }
    }

~ There's no knowledge that is not power~