3303 Stimmen

Wie kann man über ein Wörterbuch iterieren?

Ich habe ein paar verschiedene Möglichkeiten, über ein Wörterbuch in C# zu iterieren gesehen. Gibt es eine Standardmethode?

92 Stimmen

@VikasGupta Was würden Sie vorschlagen, um etwas mit einer Sammlung von Schlüssel-Wert-Paaren zu tun, wenn Sie nicht wissen, wie die Schlüssel lauten werden?

11 Stimmen

@nasch: myDictionary.Keys erhalten Sie eine Sammlung, die die Schlüssel in myDictionary .

33 Stimmen

@displayName Wenn Sie etwas mit jedem Schlüssel-Wert-Paar machen wollen, aber keinen Verweis auf die Schlüssel haben, um die Werte nachzuschlagen, würden Sie über das Wörterbuch iterieren, richtig? Ich wollte nur darauf hinweisen, dass es Fälle geben kann, in denen man das tun möchte, obwohl Vikas behauptet, dass dies in der Regel eine falsche Verwendung ist.

4521voto

Pablo Fernandez Punkte 98441
foreach(KeyValuePair<string, string> entry in myDictionary)
{
    // do something with entry.Value or entry.Key
}

1123voto

Jacob Punkte 21787

Wenn Sie versuchen, ein generisches Dictionary in C# zu verwenden, wie Sie ein assoziatives Array in einer anderen Sprache verwenden würden:

foreach(var item in myDictionary)
{
  foo(item.Key);
  bar(item.Value);
}

Oder, wenn Sie nur über die Sammlung von Schlüsseln iterieren müssen, verwenden Sie

foreach(var item in myDictionary.Keys)
{
  foo(item);
}

Und schließlich, wenn Sie nur an den Werten interessiert sind:

foreach(var item in myDictionary.Values)
{
  foo(item);
}

(Beachten Sie, dass die var Schlüsselwort ist eine optionale Funktion von C# 3.0 und höher, Sie könnten hier auch den genauen Typ Ihrer Schlüssel/Werte verwenden)

200voto

Maurício Fedatto Punkte 2517

In manchen Fällen benötigen Sie einen Zähler, der von der for-loop-Implementierung bereitgestellt werden kann. Hierfür bietet LINQ ElementAt die Folgendes ermöglicht:

for (int index = 0; index < dictionary.Count; index++) {
  var item = dictionary.ElementAt(index);
  var itemKey = item.Key;
  var itemValue = item.Value;
}

121voto

J Healy Punkte 2262

Hängt davon ab, ob Sie hinter den Schlüsseln oder den Werten her sind...

Aus dem MSDN Dictionary(TKey, TValue) Beschreibung der Klasse:

// When you use foreach to enumerate dictionary elements,
// the elements are retrieved as KeyValuePair objects.
Console.WriteLine();
foreach( KeyValuePair<string, string> kvp in openWith )
{
    Console.WriteLine("Key = {0}, Value = {1}", 
        kvp.Key, kvp.Value);
}

// To get the values alone, use the Values property.
Dictionary<string, string>.ValueCollection valueColl =
    openWith.Values;

// The elements of the ValueCollection are strongly typed
// with the type that was specified for dictionary values.
Console.WriteLine();
foreach( string s in valueColl )
{
    Console.WriteLine("Value = {0}", s);
}

// To get the keys alone, use the Keys property.
Dictionary<string, string>.KeyCollection keyColl =
    openWith.Keys;

// The elements of the KeyCollection are strongly typed
// with the type that was specified for dictionary keys.
Console.WriteLine();
foreach( string s in keyColl )
{
    Console.WriteLine("Key = {0}", s);
}

98voto

Im Allgemeinen ist die Frage nach dem "besten Weg" ohne einen spezifischen Kontext wie die Frage nach Was ist die beste Farbe? ?

Einerseits gibt es viele Farben, und es gibt keine beste Farbe. Es kommt auf den Bedarf und oft auch auf den Geschmack an.

Auf der anderen Seite gibt es viele Möglichkeiten, über ein Dictionary in C# zu iterieren, und es gibt keinen besten Weg. Es hängt von der Notwendigkeit und oft auch vom Geschmack ab.

Der einfachste Weg

foreach (var kvp in items)
{
    // key is kvp.Key
    doStuff(kvp.Value)
}

Wenn Sie nur den Wert benötigen (erlaubt den Aufruf von item , besser lesbar als kvp.Value ).

foreach (var item in items.Values)
{
    doStuff(item)
}

Wenn Sie eine bestimmte Sortierreihenfolge benötigen

Im Allgemeinen sind Anfänger über die Reihenfolge der Aufzählung in einem Wörterbuch überrascht.

LINQ bietet eine prägnante Syntax, die es erlaubt, die Reihenfolge (und viele andere Dinge) zu spezifizieren, z.B.:

foreach (var kvp in items.OrderBy(kvp => kvp.Key))
{
    // key is kvp.Key
    doStuff(kvp.Value)
}

Auch hier brauchen Sie vielleicht nur den Wert. LINQ bietet auch eine prägnante Lösung für:

  • direkt auf dem Wert iterieren (erlaubt den Aufruf von item , besser lesbar als kvp.Value )
  • aber sortiert nach den Schlüsseln

Hier ist sie:

foreach (var item in items.OrderBy(kvp => kvp.Key).Select(kvp => kvp.Value))
{
    doStuff(item)
}

Es gibt noch viele weitere reale Anwendungsfälle, die Sie anhand dieser Beispiele durchführen können. Wenn Sie keine bestimmte Reihenfolge benötigen, halten Sie sich einfach an den "einfachsten Weg" (siehe oben)!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X