Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sort order when using foreach on an array, list etc

When iterating through an array using foreach, are there any guaranties that the order in which the elements are returned is the order array[0], array[1], array[2], ...

I know this is how the Array class is implemented now but are there any guaranties for future versions of the framework? The same questions goes for List<>.

like image 580
Jakob Christensen Avatar asked Mar 24 '09 16:03

Jakob Christensen


2 Answers

I'd have to disagree with all the answers so far.

First, the C# 3.0 standard guarantees the order of foreach on an array:

The order in which foreach traverses the elements of an array, is as follows: For single-dimensional arrays elements are traversed in increasing index order, starting with index 0 and ending with index Length – 1. For multi-dimensional arrays, elements are traversed such that the indices of the rightmost dimension are increased first, then the next left dimension, and so on to the left.

-- C# Language Specification Version 3.0, page 240.

Second, on objects, foreach (C#) and For Each (VB.NET) work by using the MoveNext, Reset, and Current members on an object (source). These are typically part of the IEnumerator interface.

In collections that have an order (read: things that implement IList or IList(T)), this means that the elements will be returned in the order that the backing store stores them.

like image 100
Powerlord Avatar answered Oct 02 '22 21:10

Powerlord


There are no guarantees. Most list/array implementations will return values in order, but there are definitely exceptions, particularly in some of the less common collection classes. (For example, in C5, many collections return values in very different orders than they were added when enumerated.)

like image 27
Reed Copsey Avatar answered Oct 02 '22 21:10

Reed Copsey