2012-03-22 30 views
5

que estaba buscando en algún código de mi compañero de trabajo registró, se veía así:¿Por qué parece que el diccionario .Net está ordenado?

return list.OrderBy(item => item.Order).ToDictionary(item => item.Id); 

inmediatamente me dije a mi compañero de trabajo que su código es incorrecto, ya que el Dictionary es una tabla hash, una organización sin colección clasificada. Él debería usar una colección que preserva el orden u ordenar los artículos más tarde cuando los lee del diccionario con foreach, dije.

Pero respondió: "No, no, mi código es correcto. Mire: ahora que he agregado OrderBy, los elementos aparecen en el orden correcto".

Resulta que, en el caso de prueba, tenía razón. Probé con otros datos, ¡pero todavía estaba perfectamente ordenado!

Le dije que no debería confiar en este comportamiento, pero él no está de acuerdo, y tengo problemas para explicar por qué. Además, me interesa saber por qué el orden parece conservarse con tanta frecuencia.

Así que mi pregunta es ... ¿Por qué la Dictionary, una colección fundamentalmente desordenada, parece tanto que está ordenada?

+3

Dictionary <> ofrece ninguna garantía de que la colección es desordenada . No usa Aleatorio a propósito. Sí, el código es incorrecto. –

+1

sí Justin, este es un duplicado. La respuesta a la pregunta que vinculó es lo que quería. ¿Cómo puede encontrar duplicados tan rápidamente entre tantas preguntas sobre diccionarios? Busqué y no pude encontrarlo. ¡Gracias! –

+0

No lo sé (es por eso que publico esto como comentario) pero me imagino que es lo mismo que en SQL: las filas devueltas por 'SELECT' se devuelven en un orden no especificado a menos que se incluya una cláusula' ORDER BY' . A menudo, especialmente en conjuntos de datos pequeños, las filas se devuelven en el mismo orden en que se insertaron, lo que hace que mucha gente tropiece. (Siempre le digo a las personas que incluyan un 'ORDER BY' si les importa el orden de los resultados. * Podría * funcionar sin él, pero también podría romperse horriblemente.) –

Respuesta

6

Está ordenado, debido a cómo se implementa Dictionary (y en su caso, los elementos se agregan en orden). Pero esto es detalles de implementación.

Informe a su compañero de trabajo hay una clase SortedDictionary que existe, esto debe convencerlo de que no podemos depender de los artículos de la orden con un simple Dictionary;)

+0

Es un detalle de implementación, seguro, pero no creo que vaya a cambiar. Quizás esté bien decir que los diccionarios Add() solo mantienen el orden. –

+0

@EldritchConundrum Realmente, no debes asumir eso. Actualmente es el caso, pero en una versión futura podría no serlo. Y piense en otras implementaciones del marco (Mono por ejemplo), no hay garantía de que implementen el diccionario de la misma manera. – ken2k

+0

Sí. Más importante aún, ahora sé cómo crear un caso de prueba en el que fallará el código de mi compañero de trabajo;) Solo tengo que eliminar y agregar antes del foreach. –

3

Al iterar sobre un diccionario, obtendría los elementos en the order they were inserted to the dictionary.

En el ejemplo, una lista se ordena, luego cada elemento se agrega al diccionario sucesivamente.

El resultado final es que los elementos en el diccionario están en el orden de clasificación de la lista.

Sin embargo, este es el caso con la implementación actual de Dictionary - no hay garantía de que seguirá siendo así.

Si necesita tener los artículos en un Dictionary en un orden específico, debe utilizar un SortedDictionary.

+0

¿Puede explicar mejor por qué están ordenados? Yo diría que están "ordenados" por su hash que es la propiedad "Id" –

+1

@LuisFilipe - No los sigo. La lista fue ordenada ('lista.OrderBy (item => item.Order) 'luego convertido a un' Diccionario'. La conversión funciona al agregar cada elemento al diccionario. Los elementos en el diccionario están "ordenados" en el sentido de que están en orden de inserción. Como estaban insertados, el diccionario está en orden. – Oded

+0

¿Está esto garantizado por especificación/contrato, o es un artefacto de cómo se escribe una implementación específica? Si se trata de un comportamiento garantizado, una cita sería útil. –

Cuestiones relacionadas