Mi pregunta es sobre la enumeración de 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 se enumerarán los elementos? ¿Puedo forzar el orden alfabético?
c#
.net
dictionary
ienumerable
Capitán Comic
fuente
fuente
Respuestas:
El orden de los elementos en un diccionario no es determinista. La noción de orden simplemente no está definida para tablas hash. 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 doc :
fuente
Si desea que los elementos estén ordenados, use un OrderedDictionary . Un hastable / diccionario ordinario se ordena solo en cierto sentido del diseño de almacenamiento.
fuente
Siempre puedes usar
SortedDictionary
para eso. Tenga en cuenta que el diccionario está ordenado por clave, de forma predeterminada, a menos que se haya especificado un comparador.Soy escéptico con respecto al uso de
OrderedDictionary
para lo que desea, ya que la documentación dice que:fuente
SortedDictionary<K,V>
se implementa como un árbol de búsqueda binario, lo que le da a sus operaciones una complejidad de tiempo y espacio diferente en comparación con el basado en tablas hashDictionary<K,V>
. Si los usuarios necesitan unaO(1)
estructura de tabla hash de inserción / eliminación y también desean iterar sobre los elementos en el orden de las claves, entonces deberíandict.Keys.OrderBy( k => k ).Select( k => dict[k] )
hacerlo (a costa deO(n)
espacio yO( n log n )
tiempo) para elOrderBy()
(que necesitará almacenar toda la colección de claves en una lista interna). ).Los elementos se devolverán en el orden en el que estén almacenados físicamente en el diccionario, lo que depende del código hash y del orden en que se agregaron. 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:
En framework 2.0, primero tendría que poner los elementos en una lista para ordenarlos:
fuente
Para un diccionario ordenado:
Los artículos se devuelven en el orden en que se agregan.
fuente
Las matrices asociativas (también conocidas como tablas hash) no están ordenadas, lo que significa que los elementos se pueden ordenar de cualquier forma imaginable.
SIN EMBARGO, puede buscar las claves de matriz (solo las claves), 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 lo hagas tú mismo.
fuente