I have got a question about the order in IEnumerable
.
As far as I am aware, iterating through IEnumerable is pseudo-code can be written in the following way:
while (enumerable.HasNext())
{
object obj = enumerable.Current;
...
}
Now, assume, that one needs to operate on a sorted collection. Can IEnumerable be used in this case or is it better to try other means (i.e. IList
) with indexation support?
In other words: does the contract of IEnumerable
make any guarantees about the order in general?
So, IEnumerable
is not a proper mean for a generic interface that guarantees ordering. The new question is what interface or class should be used for an immutable collection with order? ReadonlyCollection
? IList
? Both of them contain Add()
method (even is not implemented in the former one).
My own thoughts: IEnumerable
does not provide any guarantees about the ordering. The correct implementation could return same elements in different order in different enumerations (consider an SQL query)
I am aware of LINQ First()
, but if IEnumerable
does not say a word about it's ordering, this extension is pretty useless.
IEnumerable/IEnumerable<T>
makes no guarantees about ordering, but the implementations that use IEnumerable/IEnumerable<T>
may or may not guarantee ordering.
For instance, if you enumerate List<T>
, order is guaranteed, but if you enumerate HashSet<T>
no such guarantee is provided, yet both will be enumerated using the IEnumerable<T>
interface.