Wie Durchlaufen Wörterbuch ohne Verwendung von foreach
Ich bin nicht sicher, ob der Titel formuliert es auch so Leid.
Ich haben im Grunde ein Bündel von Elementen, die Liste von Zielen für eine Kommunikation. Ich legte Sie in ein Wörterbuch, aber ich bin offen für das bewegen auf eine andere Datenstruktur. Mein problem ist, dass ich ein Baum-wie Struktur, wo ein Schlüssel ist, einem ast und jeder Zweig hat viele Blätter. Sowohl der Zweig und die Blätter haben die Namen gespeichert in strings (nicht Ziffer).
private Dictionary < string, string[]> targets;
Für jedes element im Wörterbuch ich muss senden Sie eine Mitteilung, und wenn die Gegner Antworten, die ich gehen, um das nächste Ziel und von vorne beginnen. So nach suchen, bin ich konfrontiert mit diesen Dilemmata:
- Ich nicht verwenden können, die üblichen foreach weil ich brauche, um den Zeiger im Speicher übergeben Sie zwischen den threads.
- Seit Wörterbücher sind random-access ist es schwierig, halten einen Zeiger
- Wenn ich eine Mitteilung bekommen ich soll überprüfen ob die Ursprünge sind von einem Ziel, so wie ich das Wörterbuch.enthält eine Methode für die.
Ich bin ziemlich neu bei C#, so die Antwort liegt wohl auf der Hand aber ich finde eine harte Zeit der Suche eine Datenstruktur, die genau meinen Anforderungen. Was wäre die einfachste Lösung? Kann jemand etwas empfehlen?
Danke.
BEARBEITEN
Ich glaube, mein post verwirrt viele, und Sie sind irgendwie stecken die Begriffe Zeiger und threads. Durch die threads, die ich nicht bedeuten, dass Sie parallel sind, einfach, dass ich nicht verwenden können, eine foreach oder eine Schleife, wie der nächste thread, der für die nächste iteration ausgelöst wird, durch die eingehende Kommunikation. Dieser Mechanismus kann nicht geändert werden, im moment, nur der iteration werden muss. Durch die Zeiger, die ich bezog sich nicht auf die memory-Zeiger, die oft in C, ich meinte nur etwas, dass die Punkte, wo Sie in einer Liste. Sorry, ich bin ein Java-Programmierer, so dass ich möglicherweise verwirrende Begriffe.
Bemerkte ich, dass die Enumerator ist oft vererbt und es kann verwendet werden, mit Strukturen, wie das Wörterbuch und die Verlinkte Liste. Beispiele, die ich finden sprechen Sie über diese sub-Struktur gekapselt ist, und zeigt foreach Schleifen als Beispiele.
Wäre es möglich, verwenden Sie GetEnumerator() in gewisser Weise, dass der enumerator erinnern würde, die aktuelle position, auch wenn der Zugriff durch einen anderen thread?
Ich mich auf den Weg um zu testen, diese auf meine eigene, aber wenn jeder input von erfahrenen Menschen ist immer willkommen!
- Besser verwenden Sie diese gemeinsame Datenstruktur, die in einem read-only-Mode ( es werden keine neuen Knoten) wenn Sie möchten, Durchlaufen Sie in mehreren thread ...
- Ich verstehe nicht ganz, was Sie versuchen zu erreichen. Wieso willst du Pointer anstatt Referenzen? Warum willst du die Verwendung von threads anstelle von asynchronen aufrufen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, Sie brauchen, um wieder zu arbeiten, Ihre Architektur etwas, das Wörterbuch selbst ist wohl nicht die Daten-Struktur, die Sie verwenden müssen, um für eine geordnete iteration.
Ich würde in Erwägung ziehen, Ihre Struktur in eine verkettete Liste statt.
Wenn Sie kick off Ihre Kommunikation würde ich vorschlagen, dass Ihr threads Rückruf ein Delegierter zu aktualisieren Sie Ihre Liste von Daten oder anderen freigegebenen datastructure, die verfolgt, wo Sie in den Prozess der Kommunikation.
Können Sie aufzählen über diese parallel mit Parallel.ForEach - Methode (ab .NET 4). Es wurde zurück portiert als Teil der Rx-Framework für den Einsatz in .NET 3.5sp1.
Hinweis - das nicht eigentlich ein thread pro Artikel, sondern Partitionen der Arbeit mit dem thread-pool, basierend auf der hardware-thread-Anzahl des Systems, auf dem Sie ausführen (die in der Regel besser...). In .NET 4, dauert es Vorteil der ThreadPool neue Hügel klettern und work stealing-algorithmen, so ist es sehr effizient.
ist dies eine leichte Vermutung, und ich vermute, ich hab es versaut hier irgendwo :/
im Grunde die Idee ist, erstellen Sie eine benutzerdefinierte
IEnumerator
für Ihr Wörterbuch. Die Idee, dass es enthält eine statische variable, die hält die "Lage" bei der Aufzählung, für die Fortsetzung.den folgenden ist einigen skeleton-code für etwas, das funktioniert für das anhalten und Neustarten.
Dann zu verwenden:
Ich gebe zu, dass dies nicht der sauberste Weg, es zu tun. Aber wenn Sie brechen aus den enumerator, und erstellen Sie eine neue auf einem anderen thread, dann wird es weiter an der gleichen Stelle (glaube ich :/)
Ich hoffe, das hilft.
Edit: aus Ihren Kommentaren:
Wenn Sie wollen, verarbeiten die Elemente asynchron aber nicht parallel, Sie sollten in der Lage sein, dies zu erreichen durch kopieren des Wörterbuchs Schlüssel zu einem
Queue<string>
und die Weitergabe sowohl der Rückruf, mit der asynchronen Antworten.Ihre Abschluss-handler-pseduo-code könnte wie folgt Aussehen: