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

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();

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();

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;

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.


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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.