C# - Wert Ändern von Wörterbuch-Schlüssel-Wert-paar, während in der foreach -
Habe ich diesen code, der ausgeführt wird jeden frame ein Spiel:
foreach (var repeaterAction in conditionTimes.Keys)
{
if (repeaterAction.Condition() == true)
{
if (conditionTimes[repeaterAction] == TimeSpan.Zero)
{
repeaterAction.Action();
}
else if (conditionTimes[repeaterAction] >= repeaterAction.InitialLapse)
{
repeaterAction.Action();
conditionTimes[repeaterAction] -= repeaterAction.ActionInterval;
}
conditionTimes[repeaterAction] += gameTime.ElapsedGameTime;
}
else
{
conditionTimes[repeaterAction] = TimeSpan.Zero;
}
}
Dies gibt mir die folgende Fehlermeldung:
Auflistung wurde geändert; der Enumerationsvorgang kann nicht ausgeführt werden.
Gibt es eine Möglichkeit, ändern Sie den Wert in den Schlüssel-Wert-Paare in der foreach-Schleife, ohne Sie zu kopieren Sie das Wörterbuch für jeden frame?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin mit der Beratung vor dem Versuch zu ändern, eine Sammlung, während die Schleife durch Sie mit Wörterbüchern ist es jedoch nicht möglich, da direkter Zugang verfügbar ist. Fügen Sie einfach
.ToArray()
nach derconditionTimes.Keys
imforeach
dann die Schlüssel wird eine getrennte Sammlung und ändern Sie das Wörterbuch:Müssen Sie auch ändern Sie code, so dass, wenn Sie die Taste änderungen, die Sie tatsächlich entfernen Sie einen Eintrag aus dem Wörterbuch und die neue hinzufügen, da die Tasten wirklich nicht geändert werden, nur gelöscht.
Auch dies ist nicht zu empfehlen.
Nein, das können Sie nicht. Es gibt eine böse option, die Sie verwenden könnten:
Dann würden Sie anlegen (sagen wir) eine
Dictionary<string, WrappedValue<int>>
... Iteration über die Schlüssel/Wert-Paaren, und ändern Sie den Wert innerhalb der wrapper statt der Eingabe selbst beziehen sich auf einen anderen wrapper.Ich glaube nicht, ich würde empfehlen dies, obwohl - es wäre umständlich zu bedienen, und leicht zu Missbrauch.
Weitere option, wenn Sie verwenden .NET 4 ist die Verwendung
Z. B. concurrentdictionary
, die hat gleichzeitigen änderungen.Sorry, kann man nicht.
Ich denke, Ihre beste Wette ist, um erstellen Sie ein neues Wörterbuch, dann tauschen Sie es mit dem alten ein, wenn du fertig bist mit der
foreach
Schleife.sollten Sie verwenden Sie ein anderes Muster, das zu tun, was Sie versuchen zu tun, weil die für den einzelnen nicht erlauben, Sie zu ändern, auf den der enumerator Sie sind Schleifen. Stell dir vor, Sie führen ein foreach auf eine sortierte Liste von Anfang an, Sie mit der Verarbeitung beginnen Element mit Schlüssel="A", dann gehen Sie zu "B", dann ändern Sie "C" zu "B", was wird passieren? Deine Liste gegriffen und Sie nicht mehr wissen, was Sie sind looping und wo Sie sind.
du in der Regel "könnte" es mit einem zu tun for(int i=Wörterbuch.count-1; i>=0; --i) oder so etwas wie, dass aber dies hängt auch von Ihrem Kontext, ich würde wirklich versuchen, einen anderen Ansatz.
Einem gemeinsamen Ansatz zu erinnern, den Schlüssel, den Sie ändern möchten in der ersten Runde, und dann eine zweite, die loops über den erinnerten Tasten und verändert das original-Wörterbuch. Das vermeidet das erstellen eines komplett neuen Wörterbuch mit allen Elementen.
Die Sie nicht ändern können eine Sammlung beim aufzählen, es in einen
foreach
- Anweisung. Also würden Sie entweder kopieren Sie jedes mal (Sie brauchen nur zu kopieren, die Keys). Eine andere Möglichkeit wäre die Speicherung eines separaten Schlüssel-Liste zu allen Zeiten (zum Beispiel durch Kapselung der Wörterbuch-innerhalb einer Klasse, verwaltet diesen). so etwas wie:Natürlich in einer konkurrierenden Umgebung, die Sie haben würden, um sicherzustellen, dass die dictionary-und Listen synchronisiert werden...