Working of foreach: As I know,
foreach is a loop which iterates through a collection or array one by one, starting from 0 index till the last item of the collection.
So, if I have n items in an array.
foreach (var item in arr)
{
}
then,
In, 1st iteration, item=arr[0];
then, in 2nd, item=arr[1];
.
.
.
in last (nth), item=arr[n-1];
Conclusion: from working it seems that at each iteration it knows that which value to be taken from array or it knows the index of the item to be taken from array.
Now my question: How can I get index of an item without using a new variable?
foreach (string item in mylist)
{
if (item == "myitem")
{
// get index of item
break;
}
}
It depends what you mean by "it". The iterator knows what index it's reached, yes - in the case of a List<T>
or an array. But there's no general index within IEnumerator<T>
. Whether it's iterating over an indexed collection or not is up to the implementation. Plenty of collections don't support direct indexing.
(In fact, foreach
doesn't always use an iterator at all. If the compile-time type of the collection is an array, the compiler will iterate over it using array[0]
, array[1]
etc. Likewise the collection can have a method called GetEnumerator()
which returns a type with the appropriate members, but without any implementation of IEnumerable
/IEnumerator
in sight.)
Options for maintaining an index:
for
loopUse a projection which projects each item to an index/value pair, e.g.
foreach (var x in list.Select((value, index) => new { value, index }))
{
// Use x.value and x.index in here
}
Use my SmartEnumerable
class which is a little bit like the previous option
All but the first of these options will work whether or not the collection is naturally indexed.