C # -Umkehrreihenfolge eines gleichzeitigen Stapels

Ich möchte die Reihenfolge eines gleichzeitigen Stapels in einer thread-sicheren und leistungsfähigen Weise umkehren. Die Art, wie ich das mache, ist, jedes Element des konkurrierenden Stapels aufzusammeln und es in einen anderen temporären gleichzeitigen Stapel zu schieben. Sobald der temporäre Stapel fertig ist, enthält er die umgekehrte Reihenfolge und der Hauptstapel ist leer. Ich würde dann so etwas machen:

mainStack.PushRange(tempStack.Reverse().ToArray());

Ich glaube jedoch nicht, dass dies threadsicher wäre.

TIA

0
Ja. Verwenden Sie einfach eine Sperre mit einer LinkedList und einem bool, um Ihnen mitzuteilen, von welchem ​​Ende sich das Ende ergibt.
hinzugefügt der Autor Will, Quelle
@servy Sorry für die Verwirrung, was Sie sagen, macht Sinn, aber es scheint, die Sperre ist nicht für den parallelen Stapel, sondern für etwas für eine andere Variable, die manchmal mit dem Stapel verwendet wird. Ich habe jetzt meine ursprüngliche Frage geändert, da der Stapel nicht immer innerhalb eines Sperrblocks verwendet wird.
hinzugefügt der Autor millie, Quelle
Nun, wenn Sie es sperren, wenn Sie es verwenden, müssen Sie das gleiche Schloss überall dort verwenden, wo es sonst verwendet wird, oder es kann immer noch geändert werden, wenn Sie dies tun. Wenn Sie das tun, haben Sie den Punkt der Verwendung eines ConcurrentStack ziemlich gut vereitelt.
hinzugefügt der Autor Servy, Quelle
Wenn Sie planen, einen Stack relativ häufig und nicht sehr selten umzukehren, sollten Sie idealerweise eine andere zugrunde liegende Struktur verwenden als C #. Sie möchten wahrscheinlich eine Datenstruktur verwenden, die beide Enden effizient hinzufügen/entfernen kann. Eine Deque wäre am besten, aber eine kreisförmige Anordnung könnte funktionieren. Dann können Sie einfach einen booleschen Wert angeben, der angibt, ob es vorwärts oder rückwärts ist, und es einfach umdrehen, um alles umzukehren. Offensichtlich müsste der gesamte Stack selbst geschrieben werden, damit alle Zugriffsmethoden wähl
hinzugefügt der Autor Servy, Quelle
@Kevin Ich habe zwei verschiedene Arten von Datenstrukturen benannt. Nach meinem Wissen gibt es keinen Namen für einen Stapel, der sich umdreht, an dem er liest/schreibt; da kann es wohl eins geben.
hinzugefügt der Autor Servy, Quelle
@Millie Das ist viel schlimmer. Das bedeutet, dass ein anderer Benutzer Elemente aus dem Stapel hinzufügen/entfernen kann, während Sie den Umkehrprozess durchlaufen. Das ist sehr schlecht .
hinzugefügt der Autor Servy, Quelle
@Servy Gibt es aus Neugier nur einen Namen für diese Art von Datenstruktur?
hinzugefügt der Autor Kevin, Quelle

1 Antworten

Persönlich, wenn ich so viel Flexibilität mit einer Datenstruktur brauchte (und ich war besorgt über die Effizienz oder Funktionalität von Datenstrukturen, die derzeit im Framework existieren), würde ich einfach meine eigenen schreiben und die notwendigen Accessoren und Verhaltensmodifizierungseigenschaften einschließen, die ich brauchte . Auf diese Weise wissen Sie immer, wohin es geht, wenn es nicht den Erwartungen entspricht.

0
hinzugefügt