página etiqueta elemento definicion contenido cabecera body c# .net dictionary ienumerable

c# - etiqueta - title html definicion



El orden de los elementos en el diccionario (6)

Creo que llego tarde a esta fiesta, pero siempre puedes usar SortedDictionary para eso. Tenga en cuenta que el orden es ordenado por Key, por defecto, a menos que se haya especificado un comparador.

Soy escéptico con respecto al uso de OrderedDictionary para lo que quieres ya que la documentación dice que

Los elementos de un DidderedDictionary no están ordenados por la clave, a diferencia de los elementos de una clase SortedDictionary.

Mi pregunta es sobre enumerar elementos del diccionario

// Dictionary definition private Dictionary<string, string> _Dictionary = new Dictionary<string, string>(); // add values using add _Dictionary.Add("orange", "1"); _Dictionary.Add("apple", "4"); _Dictionary.Add("cucumber", "6"); // add values using [] _Dictionary["banana"] = 7; _Dictionary["pineapple"] = 7; // Now lets see how elements are returned by IEnumerator foreach (KeyValuePair<string, string> kvp in _Dictionary) { Trace.Write(String.Format("{0}={1}", kvp.Key, kvp.Value)); }

¿En qué orden serán los elementos enumerados? ¿Puedo forzar que el orden sea alfabético?


El orden de los elementos en un diccionario no es determinista. La noción de orden simplemente no está definida para hashtables. Por lo tanto, no confíe en enumerar en el mismo orden en que se agregaron los elementos al diccionario. Eso no está garantizado

Cita del documento :

A los efectos de la enumeración, cada elemento del diccionario se trata como una KeyValuePair<TKey, TValue> que representa un valor y su clave. El orden en que se devuelven los artículos no está definido.


Las matrices asociativas (es decir, las tablas hash) no están ordenadas, lo que significa que los elementos se pueden ordenar de cualquier manera imaginable.

SIN EMBARGO, podría buscar las teclas de matriz (solo las teclas), ordenarlas alfabéticamente (a través de una función de clasificación) y luego trabajar en eso.

No puedo darte una muestra de C # porque no conozco el idioma, pero esto debería ser suficiente para que te encargues de ti.


Los elementos se devolverán en el orden en que se almacenan físicamente en el diccionario, lo que depende del código hash y del orden en que se agregaron los elementos. Por lo tanto, el orden parecerá aleatorio y, a medida que cambien las implementaciones, nunca debe depender de que el orden permanezca igual.

Puede ordenar los artículos al enumerarlos:

foreach (KeyValuePair<string, string> kvp in _Dictionary.OrderBy(k => k.Value)) { ... }

En el marco 2.0, primero debe colocar los elementos en una lista para ordenarlos:

List<KeyValuePair<string, string>> items = new List<KeyValuePair<string, string>>(_Dictionary); items.Sort(delegate(KeyValuePair<string, string> x, KeyValuePair<string, string> y) { return x.Value.CompareTo(y.Value); }); foreach (KeyValuePair<string,string> kvp in items) { ... }


Para un ordenadoDiccionario:

var _OrderedDictionary = new System.Collections.Specialized.OrderedDictionary(); _OrderedDictionary.Add("testKey1", "testValue1"); _OrderedDictionary.Add("testKey2", "testValue2"); _OrderedDictionary.Add("testKey3", "testValue3"); var k = _OrderedDictionary.Keys.GetEnumerator(); var v = _OrderedDictionary.Values.GetEnumerator(); while (k.MoveNext() && v.MoveNext()) { var key = k.Current; var value = v.Current; }

Los artículos se devuelven en el orden en que se agregan.


Si desea los elementos ordenados, use un OrderedDictionary . Un diccionario / hastable ordinario se ordena solo en algún sentido del diseño de almacenamiento.