Dictionary Einträge bearbeiten

Dictionary Einträge bearbeiten

  • 2

    Abstimmungen: 0 0,0%
  • 2

    Abstimmungen: 0 0,0%

  • Anzahl der Umfrageteilnehmer
    0

CopWorker

Erfahrenes Mitglied
Hallo zusammen,

bei mir lassen sich die Einträge einer Dictionary nicht beschreiben.
Meine Strukturen:
C#:
public struct tState
{
    public int iSubTask;
    public bool BFinish;
    public int iErrorCode;

    public tState(bool init)
    {
        iSubTask = new int();
        BFinish = new bool();
        iErrorCode = new int();
    }
}

public struct tTask
{
    public tState sState;
    public List<JObject> liTask;

    public tTask(bool init)
    {
        sState = new tState(true);
        liTask = new List<JObject>();
    }
}

Deklarierung:
C#:
private static Dictionary<int, tTask> dicTasks = new Dictionary<int, tTask>();

Eintrag anlegen:
C#:
if (!dicTasks.ContainsKey(iTaskId))
{
    tTask sTask = new tTask(true);
    dicTasks.Add(iTaskId, sTask);
}

Eintrag bearbeiten:
C#:
dicTasks[iTaskId].sState.iSubTask = 1;

Die Copmiler Meldung:
Schweregrad Code Beschreibung Projekt Pfad Datei Zeile Unterdrückungszustand
Fehler CS1612 Der Rückgabewert von "Dictionary<int, Klasse.tTask>.this[int]" ist keine Variable und kann daher nicht geändert werden.

Wie ich das verstehe ist der Zugriff mit der eckigen Klammer nur lesend zulässig.

Ist es nicht möglich einen Eintrag zu bearbeiten nachdem dieser angelegt ist?

Bitte um Hilfe.
Grüße von CopWorker
 

Zvoni

Erfahrenes Mitglied
Sollte eigentlich schreibend gehen, aber alle Beispiele die ich gefunden haben waren in der Form "Liste[Key]=Value" --> also nix mit Sub-Feldern
Hast du mal versucht (Aircode)
Code:
tTask MyTask = new tTask(True);
MyTask.sState.iSubTask = 1;
....
dicTasks[iTaskID] = MyTask;
 

CopWorker

Erfahrenes Mitglied
Hallo Zvoni,

es bleibt mir nichts anderes übrig als den betreffenden Eintrag aus der Dictionary
auf eine temporäre Variable auszulesen.
Dann das Sub-Feld bzw. die Sub-Felder in der temporären Variable zu bearbeiten.
Und schließlich den Eintrag wieder in die Dictionary zurückschieben.

C#:
tTask sTask = dicTasks[iTaskId];
sTask.sState.iSubTask = SubTask.Equals(null) ? 0 : SubTask;
dicTasks[iTaskId] = sTask;

Trotzdem vielen Dank für deine Hilfe.
Grüße von CopWorker
 

Zvoni

Erfahrenes Mitglied
Eintrag anlegen:
C#:
if (!dicTasks.ContainsKey(iTaskId))
{
    tTask sTask = new tTask(true);
    dicTasks.Add(iTaskId, sTask);
}
Was mir aufgefallen ist während meiner Recherche: Ich glaube das ist überflüssig.
Die Doku besagt explizit, dass für "dict[Key] = Value" gilt:
Existiert der Schlüssel NICHT im Dictionary wird der Eintrag automatisch angelegt.
Existiert der Schlüssel wird nur ein update ausgeführt.
 

CopWorker

Erfahrenes Mitglied
Hallo Zvoni,

nein, den Eintrag muss ich auf alle Fälle anlegen wenn er nicht existiert.
Denn die Funktion wird laufend aufgerufen.
Da kommt es vor, dass die "iTaskId" mehrmal vorkommt und somit
weitere Sub-Einträge in dem Dictionary Key "iTaskId" ereitert werden.


Grüße CopWorker
 

Spyke

Premium-User
das problem ist nicht das dictionary sondern dein Struct
Structs sind Value Types, man arbeitet nicht wie bei Klassen mit einer Referenz.

Deshalb funktioniert es bei dir wenn du den Struct kurz zwischen speicherst, damit arbeitest du nämich auf einer neuen Kopie, welche du dann wieder an das Dictionary wieder hängst.
 

CopWorker

Erfahrenes Mitglied
Hallo Spyke,

danke für den Hinweis.
So hab´ ich das auch gemacht. Siehe Beitrag #3
es bleibt mir nichts anderes übrig als den betreffenden Eintrag aus der Dictionary
auf eine temporäre Variable auszulesen.
Dann das Sub-Feld bzw. die Sub-Felder in der temporären Variable zu bearbeiten.
Und schließlich den Eintrag wieder in die Dictionary zurückschieben.

Grüße von CopWorker
 

Neue Beiträge