Member von Objekten in List<> ändern?



  • Hiho,

    Ich habe ein Frage zu List<>

    Folgender Code lässt sich nicht compilieren:

    List<System.Drawing.Recangle> rectangle;
    
    ...
    
    for (int i = 0;i < rectangle.Count ; i++)
    {
        rectangle[i].Width = i;
    }
    

    habe es jetzt so gelöst:

    List<System.Drawing.Recangle> rectangle;
    
    ...
    
    System.Drawing.Recangle [] rectarray = rectangle.ToArray(); 
    for (int i = 0;i < rectangle.Count ; i++)
    {
        rectarray[i].Width = i;
    }
    rectangle = new List<Rectangle>(rectarray);
    

    Gibt es da nicht einer bessere Lösung (komme von C++ her).

    Vielen Dank für Antworten 🙂



  • Hallo

    Warum lässt sich der Code denn nicht kompilieren? Sieht eigentlich gut aus. Initialiseren wirst du die List doch noch?

    chrische



  • Das ist so weil Rectangle ein Value Type ist.

    for (int i = 0;i < rectangle.Count ; i++) 
    {
    	Rectangle r = rectangle[i];
    	r.Width = i;
    	rectangle[i] = r;
    }
    


  • wie schauts mit einer foreach aus ?

    List<System.Drawing.Recangle> rectangle;
    
    ...
    
    int i = 0
    foreach (System.Drawing.Recangle rect in rectangle)
    {
        rect.Width = i;
        ++i;
    }
    


  • Mr Evil schrieb:

    wie schauts mit einer foreach aus ?

    List<System.Drawing.Recangle> rectangle;
    
    ...
    
    int i = 0
    foreach (System.Drawing.Recangle rect in rectangle)
    {
        rect.Width = i;
        ++i;
    }
    

    Das macht er nicht weil rect die Iterationsvariable ist...

    Was erfüllen diese value-types in C# eigentlich für einen Zweck?
    Sie ersetzen doch gewissermaßen get() und set() - Funktionen oder?
    Warum lassen diese sich nicht über einen obigen Aufruf setzen? 😞



  • Was erfüllen diese value-types in C# eigentlich für einen Zweck?

    Sie besitzen eben Value Semantik (sind z.B. kopierbar, werden auf dem Stack angelegt, ...). Im gegensatz dazu gibts die Referenz Typen.

    Sie ersetzen doch gewissermaßen get() und set() - Funktionen oder?

    Nein. Ich vermute du verwechselst sie mit den Properties.

    Simon

    Edit:

    Warum lassen diese sich nicht über einen obigen Aufruf setzen?

    Weil Du mit dem Index Operator auf der List<T> eine Kopie des gespeicherten Values bekommst. Das ist aber ein Value und kein Referenz Typ. Das bedeutet, dass der Width Wert auf einer temporären Kopie geändert wird, nicht aber auf dem Wert in der Liste.



  • Ok Vielen Dank für die ausführliche Antwort 😃

    also gibt (List<T>) liste[x]; einen value type zurück, während
    (T []) liste[x]; einen referenz type zurückgibt.

    Macht vll in der Hinsicht Sinn das die Konsistenz der Liste gewährleistet bleibt.



  • Nein !!!!

    also gibt (List<T>) liste[x]; einen value type zurück, während
    (T []) liste[x]; einen referenz type zurückgibt.

    Das kommt natürlich auf T an. T ist entweder ein Value Type oder ein Ref. Type.
    Simon



  • int i=0;
    rectangle.ForEach(it=> it.Width=(i++) );
    

Anmelden zum Antworten