Verschachtelte Dictionary

CopWorker

Erfahrenes Mitglied
Hallo zusammen,

ich verwende eine Dictionary.
Diese Dictionary ist von der Structur "tServer".
In der Structur "tServer" befindet sich wiederum eine Dictionary von der Structur "tComputer".

Der Aufbau von mehreren Einträgen auf der Ebenen "tServer" ist mir gelungen.
Auch der Aufbau von mehreren Einträgen auf der Ebene "tComputer" ist mir gelungen.

Jetzt mein Problem.
Wie kann ich die einzelnen Einträge der beiden Dictionary nachträglich bearbeiten.
Das Auslesen der Einträge ist nicht das Problem.
Beim zurückschreiben kommt der Fehler: "Die Sammlung wurde geändert".

Die "foreach" Schleife ist hierfür wahrscheinlich auch nicht geeignet, denke ich mal.

Aber wie geht das mit der "for" Schleife? Ich brauche doch 2 davon ineinander verschachtelt.
C#:
public struct tServer
{
    public string strNameInfo;
    public Dictionary<string, tComputer> dicComputer;
}

public struct tComputer
{
    public string strNameInfo;
    public bool BConnected;
    public string strMsg;
}


private Dictionary<string, tServer> dicServers = new Dictionary<string, tServer>();


public int MultiConnect(string strServer, string strComputer)
{
    foreach (var server in dicServers)
    {
        if (server.Key == strServer || strServer == "")
        {
            sServer = server.Value;
            strServerKey = server.Key;

            foreach (var computer in sServer.dicComputer)
            {
                if (computer.Key == strComputer || strComputer == "")
                {
                    sComputer = computer.Value;
                    strComputerKey = computer.Key;

                    sComputer.strMsg = "Verbindung wird hergestellt";

                    sServer.dicComputer[strComputerKey] = sComputer;
                }
            }

            dicServers[strServerKey] = sServer;
        }
    }
}

Vielen Dank.
Grüße von CopWorker
 

Spyke

Premium-User
Mit der for Schleife kannst du bei dictionary nicht arbeiten.
Du könntest dir intern eine Hilfsliste machen und diese durchlaufen.

Im Spoiler den Teil hatte ich geschrieben bevor ich aufs ToList kahm und sah das es so wie du den struct anhabst der untere Lösungsteile funktionieren könnte.
(wollt jetzt aber den Teil nicht entfernen, sondern so reininformativ stehen lassen, deshalb als Spoiler bissl anders markiert quasi)

Dein Problem ist aber du arbeitest mit struct.
Struct sind value types, sprich du würdest dann auf einer Kopie werte ändern und nicht im original.

Dein tServer und tComputer müssten Klassen sein (class) dann wären es Referenztypen.
Bei Refernztypen wird quasi immer die Speicheradresse des Objektes weitergegeben wodurch bei änderungen am Objekt diese auch im original erfolgen.

was ev. noch gehen könnte wenn du nur die Keys des dictionary in einer extra Liste hälst und dies durchläufst
(dann könnte es auch mit struct klappen, so wie du mit arbeitest in dem du die neue Kopie wieder setzt)
(Achtung im folgendem wird mit der Linq Methode ToList gearbeitet, diese erstellt eine neue List<T> so das das dictionary für den foreach durchlauf unberührt bleibt)
C#:
public int MultiConnect(string strServer, string strComputer)
{
    foreach (string strServerKey in dicServers.Keys.ToList())
    {
        if (strServerKey == strServer || strServer == "")
        {
            sServer = dicServers[strServerKey];

            foreach (string strComputerKey in sServer.dicComputer.Keys.ToList())
            {
                if (strComputerKey == strComputer || strComputer == "")
                {
                    sComputer = sServer.dicComputer[strComputerKey];

                    sComputer.strMsg = "Verbindung wird hergestellt";

                    sServer.dicComputer[strComputerKey] = sComputer;
                }
            }

            dicServers[strServerKey] = sServer;
        }
    }
}
(ungetestet)
 
Zuletzt bearbeitet:

CopWorker

Erfahrenes Mitglied
Hallo Spyke,

so habe ich das jetzt gemacht.

C#:
public struct tServer
{
    public string strNameInfo;
    public Dictionary<string, tComputer> dicComputer;
}

public struct tComputer
{
    public string strNameInfo;
    public bool BConnected;
    public string strMsg;
}


private Dictionary<string, tServer> dicServers = new Dictionary<string, tServer>();


public int MultiConnect(string strServer, string strComputer)
{
    tServer sServer = new tServer();
    tComputer sComputer = new tComputer();
    KeyValuePair<string, tServer> sServerPair;
    KeyValuePair<string, tComputer> sComputerPair;
            
    for (int iServ = 0; iServ < dicServers.Count; iServ++)
    {
        sServerPair = dicServers.ElementAt(iServ);
        strServerKey = sServerPair.Key;
        sServer = dicServers[sServerPair.Key];
                
        if (strServerKey == strServer || strServer == "")
        {
            for (int iComp = 0; iComp < sServer.dicComputer.Count; iComp++)
            {
                sComputerPair = sServer.dicComputer.ElementAt(iComp);
                strComputerKey = sComputerPair.Key;
                sComputer = sServer.dicComputer[strComputerKey];
                
                if (strComputerKey == strComputer || strComputer == "")
                {
                    sComputer.strMsg = "Verbindungs wir hergestellt";

                    sServer.dicComputer[strComputerKey] = sComputer;
                }
            }

            dicServers[strServerKey] = sServer;
        }
    }
}

Ob das elegant ist oder nicht. Hauptsache es funktioniert ordentlich.

Vielen Dank nochmals.
Grüße CopWorker
 

Neue Beiträge