Konwertuj wartości słownikowe na tablicę

82

Jaki jest najbardziej efektywny sposób zamiany listy wartości ze słownika na tablicę?

Na przykład, jeśli mam Dictionarygdzie Keyjest Stringi Valuejest Foo, chcę dostaćFoo[]

Używam VS 2005, C # 2.0

leora
źródło

Odpowiedzi:

125
// 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
źródło
Czy rozszerzenie .ToArray <Foo> () działa lepiej?
Goran
ale skąd wiemy, że jest najbardziej wydajny?
Tom Carter
2
@Tom Zwykle uważam, że wszystko, co jest wbudowane w framework (jak .CopyTo () lub .ToArray ()), jest najefektywniejszym sposobem na zrobienie tego. Microsoftowie są mądrzejsi ode mnie. :)
Matt Hamilton,
5
ToArray jest mniej wydajne niż CopyTo (używa CopyTo do kopiowania do wewnętrznej reprezentacji pośredniej, a następnie Copy ponownie, aby ją zwrócić). Jednak, podobnie jak w przypadku wszystkich kwestii związanych z mikro-wydajnością, chodzi o czytelność, solidność i łatwość konserwacji oraz mierzenie wydajności, jeśli jest to problem.
ICR
16
ToArray () jest metodą rozszerzającą w LINQ, więc musisz dodaćusing System.Linq;
Christian Davén,
12

Zapisz to na liście. To jest łatwiejsze;

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

Oczywiście, jeśli chcesz, aby było to w tablicy;

Foo[] arr = (new List<Foo>(dict.Values)).ToArray();
Steztric
źródło
6

W wartościach znajduje się funkcja ToArray ():

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

Ale nie sądzę, że jest wydajny (tak naprawdę nie próbowałem, ale myślę, że kopiuje wszystkie te wartości do tablicy). Czy naprawdę potrzebujesz tablicy? Jeśli nie, spróbuję przekazać IEnumerable:

IEnumerable<Foo> foos = dict.Values;
Grzenio
źródło
4

Jeśli chcesz używać linq, możesz spróbować wykonać następujące czynności:

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

Nie wiem, który jest szybszy czy lepszy. Obie działają dla mnie.

Piotr Czyż
źródło
2
dict.Values.ToArray()robi to samo, ale bez kosztów związanych z materializacją każdej wartości przez delegata.
Lance U. Matthews,
1

Obecnie, gdy LINQ jest już dostępny, możesz przekonwertować klucze słownika i ich wartości na pojedynczy ciąg.

Możesz użyć następującego kodu:

// 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
źródło