foreach will iterate over any object of a class that implements IEnumerable
(take note that IEnumerable<T>
inherits from it). Such objects include some built-in ones, but not limit to: List<T>
, T[]
(arrays of any type), Dictionary<TKey, TSource>
, as well as interfaces like IQueryable
and ICollection
, etc.
syntax
foreach(ItemType itemVariable in enumerableObject)
statement;
remarks
ItemType
does not need to match the precise type of the items, it just needs to be assignable from the type of the itemsItemType
, alternatively var
can be used which will infer the items type from the enumerableObject by inspecting the generic argument of the IEnumerable
implementation;
)enumerableObject
is not implementing IEnumerable
, the code will not compileItemType
(even if this is not specified but compiler-inferred via var
) and if the item cannot be cast an InvalidCastException
will be thrown.Consider this example:
var list = new List<string>();
list.Add("Ion");
list.Add("Andrei");
foreach(var name in list)
{
Console.WriteLine("Hello " + name);
}
is equivalent to:
var list = new List<string>();
list.Add("Ion");
list.Add("Andrei");
IEnumerator enumerator;
try
{
enumerator = list.GetEnumerator();
while(enumerator.MoveNext())
{
string name = (string)enumerator.Current;
Console.WriteLine("Hello " + name);
}
}
finally
{
if (enumerator != null)
enumerator.Dispose();
}