Iteration über C# dictionary-Schlüssel mit index?
Wie kann ich die Iteration über ein Dictionary ist der Schlüssel bei der Aufrechterhaltung der index der Schlüssel.
Was ich getan habe, ist merge eine foreach
-Schleife eine lokale variable i
die wird um eins erhöht für jede Runde, die der Schleife.
Hier ist mein code, der funktioniert:
public IterateOverMyDict()
{
int i=-1;
foreach (string key in myDict.Keys)
{
i++;
Console.Write(i.ToString() + " : " + key);
}
}
Allerdings scheint es wirklich low-tech, um eine lokale variable i
.
Ich Frage mich, ob es einen Weg gibt, wo ich nicht haben, um die "extra" - variable?
Nicht sagen, dass dies eine schlechte Weise, aber gibt es einen besseren?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keinen solchen Begriff, wie "der index der Schlüssel". Sie sollten immer behandeln
Dictionary<TKey, TValue>
als mit einer unvorhersagbaren Reihenfolge - wobei die Reihenfolge, die Sie passieren zu bekommen beim Durchlaufen der es ändern kann. (So in der Theorie, könnten Sie fügen Sie einen neuen Eintrag ein, und die Einträge werden in einer völlig anderen Reihenfolge nächste mal, wenn Sie iteriert über diese. In der Theorie könnte dies sogar passieren ohne ändern Sie die Daten, aber das ist weniger wahrscheinlich, in normal-Implementierungen.)Wenn Sie wirklich wollen den numerischen index, dem Sie geschehen, zu beobachten, diese Zeit, die Sie nutzen könnten:
... aber bewusst sein, dass das eine ziemlich irreführende Darstellung, wie er schlägt vor, eine inhärente bestellen.
Aus der Dokumentation:
EDIT: Wenn Sie nicht wie die
Select
hier nennen, Sie könnte erstellen Sie Ihre eigenen extension Methode:Dann Ihre Schleife wäre:
TValue
im moment, ich brauche nur zu drucken, die Tasten mit einer Art von index vor Ihnen, so dass Benutzer können geben Sieselect 1
und es wird dann die Schlüssel mit dem index 1 (die Taste mit1
vor, in gedruckter version, das ist.)TValue
an alle und ich bin nur das drucken der Taste und ein int davor. Und mit allem Respekt, dass LINQ sieht schrecklich aus, und ich würde lieber meine eigene Lösung, vielen Dank für deine Antwort tho 🙂Technisch, der Schlüssel ist der index in einer
Dictionary<TKey, TValue>
. Sie sind nicht garantiert, um die Elemente in einer bestimmten Reihenfolge, so dass es wirklich keinen numerischen index angewendet werden.Nicht wirklich. Beachten Sie, dass die Schlüssel in einem Wörterbuch sind nicht logisch "bestellt". Sie verfügen nicht über einen index. Es gibt keine erste oder Letzte Schlüssel, aus dem Wörterbuch Sicht. Sie verfolgen Ihre eigenen, ob dies der erste Schlüssel zurückgegeben, indem Sie den enumerator, wie Sie tun, aber das Wörterbuch hat kein Konzept von "gib mir die 5. - Taste", so dass Sie nicht verwenden können, eine
for
Schleife mit einem indexer als könnte man mit einer Liste oder einem array.Wörterbüchern nicht genau Listen, arrays oder Vektoren. Sie nehmen diese Konstrukte einen Schritt weiter. Die-Taste können Sie die index:
In diesem Punkt sind Sie wahrscheinlich fehlt den meisten der Vorteile, die ein Wörterbuch (das ist ähnlich wie die Aufzählung mit dem Vorteil der Sortierung schnell auf Schlüssel-Werte), und verwenden Sie es wie eine Liste.
Select((Eingabe, Index) => neue { Eintrag, Index }) - Ansatz ist wahrscheinlich am besten in den spezifischen Kontext dieser Frage, aber, als alternative, System.Linq -.Zählbare jetzt können Sie konvertieren Sie ein Wörterbuch in einer Liste. So etwas wie dies funktionieren würde:
Gibt es Vorteile & Nachteile beider Methoden, je nachdem, was Sie zu tun versuchen.