ASP MVC.net C#: example.value = 0; nicht möglich

eqor

Cadet 4th Year
Registriert
Jan. 2020
Beiträge
88
Hallo
Vorab soll erwähnt sein, dass ich ein Anfänger bin. :)
Ich habe ein Dictionary angelegt. Jedes Element besteht aus einem Beruf und einer dazugehörigen Zahl. Diese Zahl soll, sobald man zur Startseite wechselt bei jedem Element auf 0 gesetzt werden.
Also schreibe ich folgendes im Controller zur Startseite:
1578911740791.png

Folgendes Problem wid bei Beruf.Value angegeben:
Für die EIgenschaft oder den Indexer "KeyValuePair<string, int>.Value" ist eine Zuweisung nicht möglich. Sie sind schreibgeschützt.

Wieso ist es schreibgeschützt?
Das ist der Code zum Anlegen des Dictionarys:
1578911991090.png
 
Erst einmal willkommen im Forum :)

preqi schrieb:
Wieso ist es schreibgeschützt?
Weil du das iterierte Dictionary zur Laufzeit der foreach-Schleife verändern willst, was nicht erlaubt ist. Du kannst auch keine Collection iterieren, die du während der Iteration modifizierst, da sonst die gesamte Iteration inkonsistent werden würde. (Beispiel: foreach(var item in list) list.Remove(item))
Der richtige Ansatz wäre hier sich die Schlüssel zu extrahieren und in einer Liste zu speichern (dictionary.Keys.ToList() oder new List<string>(dictionary.Keys)), welche dann für die Interation benutzt wird:
C#:
var berufe = FragenXML.AlleBerufe();
var keys = berufe.Keys.ToList(); // benötigt LINQ
var keys = new List<string>(berufe.Keys); // alternativer Weg

foreach(var key in keys) {
    berufe[key] = 0;
}
 
  • Gefällt mir
Reaktionen: Hayda Ministral und eqor
Nero1 schrieb:
Weil du das iterierte Dictionary zur Laufzeit der foreach-Schleife verändern willst, was nicht erlaubt ist. Du kannst auch keine Collection iterieren, die du während der Iteration modifizierst, da sonst die gesamte Iteration inkonsistent werden würde. (Beispiel: foreach(var item in list) list.Remove(item))
Das ist so nicht richtig.
Wie @Darlis schon schreibt, kannst du ein KeyValuePair niemals ändern, das hat überhaupt nichts mit der foreach-Schleife zu tun.
Selbstverständlich kann man die Objekte in einer Collection in der Schleife ändern, sonst bekämen wir massive Probleme. Nur die Collection selbst muss intakt bleiben, daher das bekannte "Problem" mit list.Remove(item).

Code:
    class SimpleKeyValue
    {
        public string Key { get; set; }
        public int Value { get; set; }
        public SimpleKeyValue(string key, int value)
        {
            Key = key;
            Value = value;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, int> dic = new Dictionary<string, int>();
            dic.Add("test1", 1);
            dic.Add("test2", 2);
            dic.Add("test3", 3);
            KeyValuePair<string, int> kp = dic.First();
            //geht nicht:
            kp.Value = 0;


            List<SimpleKeyValue> list = new List<SimpleKeyValue>();
            list.Add(new SimpleKeyValue("test1", 1));
            list.Add(new SimpleKeyValue("test2", 2)); 
            list.Add(new SimpleKeyValue("test3", 3));
            //geht:
            foreach (SimpleKeyValue skv in list)
                skv.Value = 0;
        }
    }
 
  • Gefällt mir
Reaktionen: eqor
Zurück
Oben