Recuperar elemento del diccionario por número

Tengo un Dictionary donde la clave y el valor son cadenas. Es posible obtener el valor de una clave usando []. Pero el [] espera una cadena. ¿Es posible obtener el valor de una clave utilizando un número en lugar de la clave de cadena?

Dictionary<String, String> m_GermanEnglish = new Dictionary<String, String>();
m_GermanEnglish.Add("der", "the");

preguntado el 12 de junio de 12 a las 16:06

¿Por qué quieres hacer esto? parece que debe estar haciendo algo mal si tiene un índice que desea convertir en un valor... -

5 Respuestas

el IDictionary interface no garantiza el orden de los elementos al enumerar el diccionario, el diccionario está intrínsecamente desordenado. Por lo tanto, no existe el 'elemento en la posición 1' ya que la colección no está ordenada.

Sería válido que los ítems aparecieran en un orden diferente cada vez que enumeras el diccionario.

Si también necesita acceder a los elementos por índice, entonces necesita una estructura de datos diferente, como un IOrderedDictionary implementación. hay uno aquí que básicamente mantiene una lista al lado del diccionario para proporcionar acceso por índice.

Respondido el 12 de junio de 12 a las 16:06

Usted puede utilizar LINQ

m_GermanEnglish.ElementAt(index);

Pero confía en una implementación que no conoce o que no está garantizada. El diccionario no garantiza que los elementos estén en un orden determinado.

Respondido el 12 de junio de 12 a las 16:06

+1 Si bien es probable que esto funcione para siempre, no hay nada que impida que la implementación cambie en el futuro y provoque que su código que usa esto se rompa de manera horrible. Usted ha sido advertido. - sam titular

No puede indexar en diccionarios por ordinal ya que los elementos no tienen un ordinal en el sentido obvio, solo expone la clave como un índice. Los diccionarios tampoco garantizan el orden. Agregue una clave o elimine una clave, y es indeterminado donde aterrizará esa tecla en términos de "posición de memoria".

Si desea obtener cosas mediante un índice ordinal, supongo que necesita una colección diferente y no la Dictionary<>.

Tal vez un List<Tuple<string, string>>? Obviamente, esto no brinda ningún soporte duplicado, pero le permite emparejar elementos y le brinda un índice.

Respondido el 12 de junio de 12 a las 16:06

Semánticamente, correcto. Sin embargo, será bastante fácil simplemente enumerar el diccionario en un foreach para exponerlo como un conjunto de KeyValuePair<string, string> elementos. - Tejas

@Tejs De hecho, pero eso implica saber el "por qué" detrás de la necesidad de indexar los elementos. - adam houldsworth

@Tejs Cierto, pero no hay garantía de que los elementos estén en el mismo orden en que se ingresaron, por lo que indexarlos sería bastante inútil. - Var simple

El orden de los elementos en un diccionario no está definido: http://msdn.microsoft.com/en-us/library/ekcfxy3x.aspx Es decir, solo se garantiza que el orden de la colección de valores sea el mismo que el de las claves, pero Dictionary se reserva el derecho de cambiarlos.

Otras opciones: puede mirar el antiguo NameObjectCollection: hace lo que está pidiendo, pero es anterior a los genéricos, por lo que es solo un diccionario de objetos (y si usa reflector para ver NameObjectCollection, verá que hicieron lo mismo cosa: realmente implementan 2 colecciones, una HashTable y una Lista).

Puede almacenarlos solo en una lista y buscar usando LINQ, pero si esta es una buena solución depende de cuántos elementos necesita almacenar (la búsqueda en el diccionario es O (1), la búsqueda en la lista será O (n) en mejor.

Respondido el 12 de junio de 12 a las 16:06

Usando las funciones de extensión en el espacio de nombres System.Linq, puede hacer lo siguiente:

var indexedDictionary = m_GermanEnglish.ToArray();
var pairAt0 = indexedDictionary[0];

También podrías usar el .ToList función de extensión en lugar de .ToArray. Ambos devuelven una colección de KeyValuePair<TKey, TValue> objetos.

Nota: Es posible que las entradas de un diccionario no se clasifiquen necesariamente en el mismo orden en que se colocaron.

Si necesita mantener cierto orden en sus pares Clave/Valor en su diccionario, es mejor que use un OrdenarDiccionario o con una ListaOrdenada. En mis pruebas, SortedList tendía a ser aproximadamente 2 veces más rápido en búsquedas e indexación por clave, pero SortedDictionary fue aproximadamente 100 veces más rápido en la eliminación de entradas.

Respondido el 12 de junio de 12 a las 16:06

Esto no es óptimo porque no tiene idea de cómo se organizará la matriz resultante, y para organizarla se necesitaría una llamada adicional (relativamente lenta). - tmesser

También estaba recordando eso y me aseguré de que estuviera incluido en la respuesta. - Jon Senchyna

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.