Pregunta

¿Es seguro asumir que dos iteraciones sobre la misma colección devolverán los objetos en el mismo orden? Obviamente, se supone que la colección no se ha cambiado de otra manera.

¿Fue útil?

Solución

Respuesta corta: sí.

Obviamente, sin embargo, el orden de los elementos en la colección puede no ser exactamente como se insertaron, dependiendo del tipo de colección (un diccionario, por ejemplo).

Pero obtendrá los mismos resultados cada vez que itere sobre una colección única y no modificada utilizando un bucle foreach.

Otros consejos

Depende del tipo de colección. Para la mayoría de las colecciones, la respuesta es & Quot; Sí & Quot ;.

Sin embargo, esto no está garantizado. Los documentos de un tipo de colección deben especificar si lo hace o no, pero como la mayoría lo hace, ese detalle generalmente se pasa por alto. Sin embargo, si no es estable, sería un descuido tremendo si los documentos no lo mencionaran.

No puede garantizar esto a menos que conozca la implementación concreta de la clase sobre la que está iterando.

Las colecciones que tienen un orden de elementos definido (por ejemplo, List<T>) se enumerarán en un orden estable.

Para las colecciones donde el estado del objeto no cambia, es muy probable que los elementos vuelvan en el mismo orden, p. Dictionary<K,V>, aunque esto no está garantizado por la especificación.

Como ejemplo de dónde este no sería el caso, podría imaginar una implementación de diccionario basada en tabla hash que compacta o redimensiona la tabla de forma asincrónica. Dicha implementación no garantizaría un orden de iteración estable.

Mientras que la respuesta es & # 8220; sí & # 8221; Para todas las colecciones integradas y probablemente para cualquier clase de colección sensata, la documentación no tiene restricciones formuladas para IEnumerable. Por lo tanto, nada nos dice que cada iteración debe ser estable.

Me imagino el siguiente caso de uso:

foreach (int i in new Shuffler(1, 2, 3, 4, 5, 6, 7, 8, 9))
    Console.WriteLine(i);

Esto bien podría implementarse como una clase que produce un orden diferente para cada iteración.

Entonces & # 8211; si también desea considerar casos límite extraños, la respuesta debe ser & # 8220; no & # 8221 ;.

Aunque normalmente, los elementos se devolverán en el mismo orden, no hay absolutamente ninguna garantía. Depende completamente de la implementación interna de la clase de colección.

Puedo ver un caso para una clase de colección que está específicamente diseñada para devolver elementos en un orden aleatorio, por ejemplo.

En resumen, a menos que conozca la implementación interna de la clase de colección, no asuma nada sobre el pedido.

Linq define la interfaz IOrderedEnumerable para este propósito.

Re " sin modificar " (Respuesta de NM): tenga en cuenta que muchos contenedores complejos como Dictionary no garantizan la preservación del orden. A veces, agregar un elemento hará que parezca el último (dando la impresión de que se conserva el orden), y a veces hará que los cubos internos se reorganicen, dando un orden completamente diferente.

Cosas como SortedList <, > etc. obviamente tienen sus propias reglas.

Yo diría que para la mayoría de las colecciones es seguro asumir esto. No está fuera del alcance de la posibilidad de que una determinada colección pueda tener el enumerador implementado de una manera no determinista, pero eso probablemente no va a suceder ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top