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

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

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

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;

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í.


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);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.