Ich habe ein paar verschiedene Möglichkeiten, über ein Wörterbuch in C# zu iterieren gesehen. Gibt es eine Standardmethode?
Antworten
Zu viele Anzeigen?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
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;
}
}
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}");
}
使用方法 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
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 inmyDictionary
.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.
48 Stimmen
Die Behauptung, es handele sich um eine falsche Verwendung, impliziert, dass es eine bessere Alternative gibt. Was ist das für eine Alternative?
71 Stimmen
VikasGupta liegt falsch, das kann ich nach vielen Jahren hochleistungsfähiger C#- und C++-Programmierung in nicht-theoretischen Szenarien bestätigen. Es gibt tatsächlich häufige Fälle, in denen man ein Wörterbuch erstellt, eindeutige Schlüssel-Wert-Paare speichert und dann über diese Werte iteriert, die nachweislich eindeutige Schlüssel innerhalb der Sammlung haben. Die Erstellung weiterer Sammlungen ist ein wirklich ineffizienter und kostspieliger Weg, um die Iteration von Wörterbüchern zu vermeiden. Bitte geben Sie eine gute Alternative als Antwort auf die Frage an, um Ihren Standpunkt zu verdeutlichen, ansonsten ist Ihr Kommentar ziemlich unsinnig.
3 Stimmen
Auch zur Fehlersuche und um herauszufinden, was in Ihrem Wörterbuch steht, wenn etwas schief läuft. Dies ist sehr hilfreich
13 Stimmen
VikasGupta hat zu 100 % recht. Wenn Sie " eine Sammlung von Schlüssel-Werte-Paaren "und nicht wissen, was sie damit tun sollen, können Sie buchstäblich es in eine
ICollection<KeyValuePair>
(Einfachste Umsetzung:List
). Und wenn Sie sich mit " leistungsstarke Programmierung ", dann sollten Sie wissen, dass Das Einzige, was Wörterbücher schneller können, ist das Nachschlagen eines Eintrags über einen Schlüssel. - das Hinzufügen von Artikeln ist langsamer und das Iterieren über ein Wörterbuch kann leicht doppelt so lange dauern wie das Iterieren über eine Liste .0 Stimmen
Es gibt drei weitere Möglichkeiten, dies zu tun: 1- for Loop 2- Parallel Enumerable.ForAllMethod 3- String.Join Ein Beispiel für den Code finden Sie unter diesem Link: techiedelight.com/iterate-over-dictionary-csharp
1 Stimmen
Ich schätze, dass die Umwandlung eines Wörterbuchs in eine Liste (auch mit LINQ) eine Iteration erfordert. Oder was, wenn Sie eine Methode für jedes Element im Wörterbuch aufrufen müssen?
1 Stimmen
@MateenUlhaq Ich denke, dass Sie die Frage zu sehr verkürzt haben. Jetzt ( 5. Überarbeitung ) ist es fast eine Paraphrase des Titels, ohne jeden zusätzlichen Kontext. Ich stimme dafür, zur vorherigen Version zurückzukehren.
1 Stimmen
@TheodorZoulias Der Kontext wird wahrscheinlich nicht benötigt, damit die Frage funktioniert, da "Was ist der beste Weg / Standard"-Fragen normalerweise als Off-Topic angesehen werden, aber ich habe sie umgewandelt.