2009-03-24 16 views
6

Al iterar a través de una matriz usando foreach, hay garantías de que el orden en que se devuelven los elementos es la matriz de orden [0], matriz [1], matriz [ 2], ...Clasificar el orden al usar foreach en una matriz, enumerar etc.

Sé que esta es la forma en que se implementa la clase Array ahora, pero ¿hay alguna garantía para las versiones futuras del marco? Las mismas preguntas se aplican a la lista <>.

Respuesta

20

Tendría que estar en desacuerdo con todas las respuestas hasta ahora.

En primer lugar, garantiza el estándar C# 3.0 el orden de foreach en una matriz:

El orden en que foreach atraviesa los elementos de una matriz, es como sigue: Para las matrices unidimensionales elementos son atravesadas en el aumento de orden de índice, comenzando con el índice 0 y terminando con índice Longitud - 1. Para matrices multidimensionales, los elementos se atravesados ​​de tal manera que los índices de la dimensión más a la derecha se incrementan primero, luego, la siguiente dimensión a la izquierda, y así sucesivamente a la izquierda.

- C# Language Specification Version 3.0, página 240.

En segundo lugar, en los objetos, foreach (C#) y para cada uno (VB.NET) de trabajo mediante el uso de la MoveNext, RESET, y actuales miembros de un objeto (source) Estos son típicamente parte de la interfaz de IEnumerator.

En las colecciones que tienen un pedido (léase: cosas que implementan IList o IList (T)), esto significa que los elementos se devolverán en el orden en que el almacén de respaldo los almacena.

+4

+1, ya que esto es correcto para todas las matrices y listas estándar. Aunque es pedante, una clase personalizada que implemente IList (T) puede implementar su propio enumerador para devolver los elementos en el orden que desee. – Joe

+0

¡Excelente! Gracias. Acabo de ganar una apuesta contra un colega :) –

+1

Esto es cierto para Array, pero no necesariamente para otras colecciones. –

5

No hay garantías. La mayoría de las implementaciones de lista/matriz devolverán los valores en orden, pero definitivamente hay excepciones, particularmente en algunas de las clases de colección menos comunes. (Por ejemplo, en C5, muchas colecciones devuelven valores en órdenes muy diferentes de las que se agregaron cuando se enumeraron).

+4

No estoy de acuerdo con los votos abajo aquí. Como mencioné, hay implementaciones de listas que no garantizan el orden. La matriz estándar en C# así como las clases de lista BCL garantizan el orden, pero la pregunta original no se limitó a estos ... –

0

Sin garantía de diseño. foreach está destinado a la enumeración sin orden e implica que el tiempo de ejecución incluso podría procesar varios elementos en paralelo. Nunca debe confiar en ningún orden de enumeración.

Cuestiones relacionadas