2009-03-04 16 views
14

Un compañero de trabajo utilizó un bucle for para repetir una lista en algún código C# que escribió y dejó el comentario, "no usó para cada uno porque no estaba seguro de que itere en orden. Quién sabe qué hará Microsoft". Por ejemplo, supongamos que tenemos una lista integrada así:¿Está garantizado que la declaración foreach de .NET itere una colección en el mismo orden en el que se creó?

var someList = new List<string>(); 

someList.Add("one"); 
someList.Add("two"); 
someList.Add("three"); 

mi compañero de trabajo utiliza algo como esto:

for (int i = 0; i < someList.Count; i++)  
{ 
    System.Diagnostics.Debug.WriteLine(someList[i]); 
} 

en lugar de esto:

foreach (var item in someList)    
{ 
    System.Diagnostics.Debug.WriteLine(item); 
} 

supongo que tiene miedo de la los elementos pueden salir en un orden diferente al que se agregaron a la colección. Creo que está siendo un poco paranoico, pero técnicamente, la documentación no indica el orden en que se itera la colección. ¿Es posible que una instrucción foreach atraviese una matriz o un objeto de colección en cualquier orden que no sea desde el límite más bajo al más alto?

Respuesta

33

Su pregunta es con respecto a List<T>, que mantiene el orden.

foreach, solo, no se garantiza que haga nada. Simplemente le pregunta al objeto proporcionado por su enumerador, que podría hacer cualquier cosa, potencialmente.

+3

+1 Ah, no, el efecto Skeet te hace obtener menos votos. –

+0

Probando para ver si puedo superar el efecto Skeet. Dedos cruzados. –

+4

Actualmente tiene uno más que yo debido a mi propio voto popular. Supongo que no es el efecto Skeet que quería decir;) –

22

Depende de la colección:

  • Para List<T> se garantiza que sea orden de inserción. (Esto solo asume las llamadas Add como se muestra. Si inserta elementos en la lista en lugares específicos, se devolverán en las puntas correctas que esperaría). Básicamente es el mismo orden que obtendría tomando list[0], list[1] , list[2] etc.
  • Para Dictionary<TKey, TValue> no hay pedidos garantizados.
  • Para SortedList<TKey, TValue> (y similares) estará en el orden de comparación clave - ese es el punto del tipo.
  • Las matrices siempre salen en orden de elementos.
+0

Aunque estás en lo cierto, aún diría que foreach SOLO es para iterar a través de todos los objetos en una colección, y de ninguna manera garantiza ningún orden. Depende de la implementación de la colección determinar el orden que foreach seleccionará. Entonces, usar foreach no tiene un comportamiento garantizado. – DevinB

+1

@devinb Creo que eso es lo que @Jon está diciendo. –

+2

Bueno, foreach tiene garantizado el uso de GetEnumerator de la colección, por lo que si conoce el pedido del iterador de la colección, se le garantiza el mismo orden de foreach. Es completamente razonable confiar en que itere sobre una lista en orden, por ejemplo. –

4

Para responder específicamente a la pregunta, "foreach" devuelve el orden que el. GetEnumerator() devuelve. Para las listas, es el orden en el que agregó las cosas hasta el final. Para los diccionarios, es probable que sea el orden de los cubos donde se asignaron las cosas.

Cuestiones relacionadas