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.

33voto

theo Punkte 7941

Es gibt eine Vielzahl von Möglichkeiten. Mein persönlicher Favorit ist von KeyValuePair

Dictionary<string, object> myDictionary = new Dictionary<string, object>();
// Populate your dictionary here

foreach (KeyValuePair<string,object> kvp in myDictionary)
{
     // Do some interesting things
}

Sie können auch die Schlüssel- und Wertesammlungen verwenden

24voto

Pavel Punkte 4313

Con .NET Framework 4.7 kann man verwenden Zersetzung

var fruits = new Dictionary<string, int>();
...
foreach (var (fruit, number) in fruits)
{
    Console.WriteLine(fruit + ": " + number);
}

Damit dieser Code auf niedrigeren C#-Versionen funktioniert, fügen Sie System.ValueTuple NuGet package und schreiben Sie irgendwo

public static class MyExtensions
{
    public static void Deconstruct<T1, T2>(this KeyValuePair<T1, T2> tuple,
        out T1 key, out T2 value)
    {
        key = tuple.Key;
        value = tuple.Value;
    }
}

23voto

Domn Werner Punkte 472

Seit C# 7 können Sie Objekte in Variablen dekonstruieren. Ich glaube, dass dies der beste Weg ist, um über ein Wörterbuch zu iterieren.

Beispiel:

Erstellen Sie eine Erweiterungsmethode für KeyValuePair<TKey, TVal> die es dekonstruiert:

public static void Deconstruct<TKey, TVal>(this KeyValuePair<TKey, TVal> pair, out TKey key, out TVal value)
{
   key = pair.Key;
   value = pair.Value;
}

Iterieren über beliebige Dictionary<TKey, TVal> auf folgende Art und Weise

// Dictionary can be of any types, just using 'int' and 'string' as examples.
Dictionary<int, string> dict = new Dictionary<int, string>();

// Deconstructor gets called here.
foreach (var (key, value) in dict)
{
   Console.WriteLine($"{key} : {value}");
}

19voto

Pixel_95 Punkte 866

foreach ist am schnellsten, und wenn Sie nur über die folgenden Punkte iterieren ___.Values ist es auch schneller

enter image description here

15voto

sɐunıɔןɐqɐp Punkte 2857

使用方法 C# 7 fügen Sie dies hinzu Erweiterungsmethode zu jedem Projekt Ihrer Lösung:

public static class IDictionaryExtensions
{
    public static IEnumerable<(TKey, TValue)> Tuples<TKey, TValue>(
        this IDictionary<TKey, TValue> dict)
    {
        foreach (KeyValuePair<TKey, TValue> kvp in dict)
            yield return (kvp.Key, kvp.Value);
    }
}

Und verwenden Sie diese einfache Syntax

foreach (var(id, value) in dict.Tuples())
{
    // your code using 'id' and 'value'
}

Oder diese, wenn Sie es vorziehen

foreach ((string id, object value) in dict.Tuples())
{
    // your code using 'id' and 'value'
}

Anstelle der traditionellen

foreach (KeyValuePair<string, object> kvp in dict)
{
    string id = kvp.Key;
    object value = kvp.Value;

    // your code using 'id' and 'value'
}

Die Erweiterungsmethode wandelt die KeyValuePair Ihrer IDictionary<TKey, TValue> in eine stark typisierte tuple so dass Sie diese neue komfortable Syntax verwenden können.

Es wandelt -nur- die erforderlichen Wörterbucheinträge in tuples so dass es NICHT das gesamte Wörterbuch in tuples Es gibt also keine Leistungsprobleme in diesem Zusammenhang.

Die Kosten für den Aufruf der Erweiterungsmethode zur Erstellung einer tuple im Vergleich zur Verwendung des KeyValuePair direkt, was KEIN Problem darstellen sollte, wenn Sie die KeyValuePair Eigenschaften Key y Value auf neue Schleifenvariablen übertragen.

In der Praxis eignet sich diese neue Syntax sehr gut für die meisten Fälle, mit Ausnahme von Low-Level-Ultra-High-Performance-Szenarien, bei denen Sie immer noch die Möglichkeit haben, sie an dieser speziellen Stelle einfach nicht zu verwenden.

Sehen Sie sich das an: MSDN Blog - Neue Funktionen in C# 7

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