Convierta los valores del diccionario en una matriz

81

¿Cuál es la forma más eficiente de convertir la lista de valores de un diccionario en una matriz?

Por ejemplo, si tengo un Dictionarydónde Keyestá Stringy Valuees Foo, quiero obtenerFoo[]

Estoy usando VS 2005, C # 2.0

leora
fuente

Respuestas:

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
fuente
¿La extensión .ToArray <Foo> () funciona mejor?
Goran
pero ¿cómo sabemos que es el más eficiente?
Tom Carter
2
@Tom Por lo general, considero que cualquier cosa integrada en el marco (como .CopyTo () o .ToArray ()) es la forma más eficiente de hacerlo. Los Microsoft son más inteligentes que yo. :)
Matt Hamilton
5
ToArray tiene menos rendimiento que CopyTo (usa CopyTo para copiar a una representación intermedia interna, y luego Copy de nuevo para devolverlo). Sin embargo, al igual que con todos los asuntos relacionados con el micro rendimiento, busque la legibilidad, la solidez y la capacidad de mantenimiento y mida el rendimiento si es un problema.
ICR
16
ToArray () es un método de extensión en LINQ, por lo que debe agregarusing System.Linq;
Christian Davén
12

Guárdelo en una lista. Es más fácil;

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

Por supuesto, si lo desea específicamente en una matriz;

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

Hay una función ToArray () en Valores:

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

Pero no creo que sea eficiente (realmente no lo he intentado, pero supongo que copia todos estos valores en la matriz). ¿Realmente necesitas una matriz? Si no, intentaría pasar IEnumerable:

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

Si desea utilizar linq, puede intentar lo siguiente:

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

No sé cuál es más rápido o mejor. Ambos funcionan para mí.

Piotr Czyż
fuente
2
dict.Values.ToArray()hace lo mismo, pero sin la sobrecarga de materializar cada valor a través de un delegado.
BACON
1

En estos días, una vez que tenga LINQ disponible, puede convertir las claves del diccionario y sus valores en una sola cadena.

Puede utilizar el siguiente código:

// 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
fuente