Foreach 循环

foreach 将迭代实现 IEnumerable 的类的任何对象(请注意 IEnumerable<T> 继承自它)。这些对象包括一些内置的,但不限于:List<T>T[](任何类型的数组),Dictionary<TKey, TSource>,以及 IQueryableICollection 等接口。

句法

foreach(ItemType itemVariable in enumerableObject)
    statement;

备注

  1. ItemType 类型不需要匹配项目的精确类型,只需要根据项目类型进行分配
  2. 除了 ItemType 之外,还可以使用 var,它将通过检查 IEnumerable 实现的泛型参数来推断 enumerableObject 中的项类型
  3. 该语句可以是块,单个语句甚至是空语句(;
  4. 如果 enumerableObject 没有实现 IEnumerable,代码将无法编译
  5. 在每次迭代期间,当前项目被强制转换为 ItemType(即使未指定,但是通过 var 进行编译推断),如果项目无法投射,则将抛出 InvalidCastException

考虑这个例子:

var list = new List<string>();
list.Add("Ion");
list.Add("Andrei");
foreach(var name in list)
{
    Console.WriteLine("Hello " + name);
}

相当于:

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();
}