Frage

ich herausgefunden habe (auf einer harten Art), dass eine Kollektion, die aufgezählt wird, kann nicht innerhalb von „Foreach“ Anweisung geändert werden

  

"Collection modifiziert wurde;. Enumerationsvorgang ausführen kann nicht"

Nun wird die Lösung kam ich mit ist eine Dummy-Sammlung von der gleichen Größe zu erstellen, die einen Wörterbuch Schlüssel enthält und aufzuzählen darüber Sammlung in Frage zu ändern.

    private void InvalidateAuthenticatedNodes()
    {
        var dummy = new Dictionary<int, bool>(_AuthenticatedNodes.Count);
        foreach (var nodeId in _AuthenticatedNodes.Keys)
            dummy[nodeId] = false;

        foreach (var nodeId in dummy.Keys)
            _AuthenticatedNodes[nodeId] = false;

        ClearAuthenticatedDateTime();
    }

Vor Code hat gut funktioniert; Ich war in Prozess über Code Refactoring ein Func Delegierten zu verwenden, um eine Kopie der Schlüssel zurückzugeben, wie folgende

    private void InvalidateAuthenticatedNodes()
    {
        var getNodeIds = 
            new Func<Dictionary<int, bool>, IEnumerable<int>>(
                nodes => nodes.Select(node => node.Key));
        foreach (var nodeId in getNodeIds(_AuthenticatedNodes))
        {
            _AuthenticatedNodes[nodeId] = false;
        }

        ClearAuthenticatedDateTime();
    }

Im Gegensatz zu, was ich erwartet habe, getNodeIds keine Kopie zurück. Gibt es eine Möglichkeit, eine Kopie statt zurück?

* EDIT : Temporary Ergebnis vor JaredPar Antwort

ähnlich wie JaredPar Antwort, aber sein war knapper, und ich ging mit seiner Antwort. Aber hier ist das ähnliche Ergebnis kam ich mit zu teilen.

    private void InvalidateAuthenticatedNodes()
    {
        var getNodeIds = 
            new Func<Dictionary<int, bool>, IEnumerable<int>>(nodes => 
                nodes.Select(node => node.Key));
        foreach (var nodeId in getNodeIds(_AuthenticatedNodes).ToList())
        {
            _AuthenticatedNodes[nodeId] = false;
        }

        ClearAuthenticatedDateTime();
    }

* EDIT : Endergebnis (raffiniert)

_AuthenticatedNodes.Keys.ToList().ForEach(
    nodeId => _AuthenticatedNodes[nodeId] = false);
War es hilfreich?

Lösung

Fügen Sie einfach einen .ToList () bis zum Ende der Sammlung, und es wird eine vollständige Kopie der Liste automatisch zurück.

foreach (var nodeId in _AuthenticatedNodes.Keys.ToList())
    ...

Andere Tipps

Statt einen foreach verwenden, könnten Sie eine normal verwenden. Seien Sie jedoch vorsichtig beim Hinzufügen / Entfernen von Elementen, ist es die Indizes der Elemente innerhalb der Sammlung verändert.

Wenn Sie eine Enumerable-Klasse zu ändern, Ihre ursprüngliche Enumerator ungültig werden, so dass die Notwendigkeit, eine Kopie zu erstellen und Ihre Änderungen dort zu machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top