Konvertieren Sie Wörterbuchwerte in ein Array

81

Was ist die effizienteste Methode, um die Werteliste eines Wörterbuchs in ein Array umzuwandeln?

Wenn ich zum Beispiel ein DictionaryWo Keyist Stringund Valueist Foo, möchte ich bekommenFoo[]

Ich verwende VS 2005, C # 2.0

Leora
quelle

Antworten:

123
// dict is Dictionary<string, Foo>

Foo[] foos = new Foo[dict.Count];
dict.Values.CopyTo(foos, 0);

// or in C# 3.0:
var foos = dict.Values.ToArray();
Matt Hamilton
quelle
Funktioniert die Erweiterung .ToArray <Foo> () besser?
Goran
aber woher wissen wir, dass es das effizienteste ist?
Tom Carter
2
@ Tom Ich bin normalerweise der Ansicht, dass alles, was in das Framework integriert ist (wie .CopyTo () oder .ToArray ()), der effizienteste Weg ist, dies zu tun. Die Microsofties sind schlauer als ich. :)
Matt Hamilton
5
ToArray ist weniger performant als CopyTo (es verwendet CopyTo, um in eine interne Zwischendarstellung zu kopieren, und kopiert dann erneut, um es zurückzugeben). Wie bei allen Fragen im Zusammenhang mit der Mikroleistung sollten Sie jedoch Lesbarkeit, Robustheit und Wartbarkeit berücksichtigen und die Leistung messen, wenn dies ein Problem darstellt.
ICR
16
ToArray () ist eine Erweiterungsmethode in LINQ, daher müssen Sie hinzufügenusing System.Linq;
Christian Davén
12

Speichern Sie es in einer Liste. Es ist leichter;

List<Foo> arr = new List<Foo>(dict.Values);

Natürlich, wenn Sie es speziell in einem Array wollen;

Foo[] arr = (new List<Foo>(dict.Values)).ToArray();
Steztric
quelle
6

Es gibt eine ToArray () - Funktion für Werte:

Foo[] arr = new Foo[dict.Count];    
dict.Values.CopyTo(arr, 0);

Aber ich denke nicht, dass es effizient ist (ich habe es nicht wirklich versucht, aber ich denke, es kopiert alle diese Werte in das Array). Benötigen Sie wirklich ein Array? Wenn nicht, würde ich versuchen, IEnumerable zu übergeben:

IEnumerable<Foo> foos = dict.Values;
Grzenio
quelle
4

Wenn Sie linq verwenden möchten, können Sie Folgendes versuchen:

Dictionary<string, object> dict = new Dictionary<string, object>();
var arr = dict.Select(z => z.Value).ToArray();

Ich weiß nicht, welches schneller oder besser ist. Beide arbeiten für mich.

Piotr Czyż
quelle
2
dict.Values.ToArray()macht das Gleiche, aber ohne den Aufwand, jeden Wert durch einen Delegaten zu materialisieren.
Speck
1

Heutzutage können Sie, sobald Sie LINQ verfügbar haben, die Wörterbuchschlüssel und ihre Werte in eine einzelne Zeichenfolge konvertieren.

Sie können den folgenden Code verwenden:

// convert the dictionary to an array of strings
string[] strArray = dict.Select(x => ("Key: " + x.Key + ", Value: " + x.Value)).ToArray();

// convert a string array to a single string
string result = String.Join(", ", strArray);
Lior Kirshner
quelle