color: #ff0000">前言
在foreach语句中使用枚举,可以迭代数组或集合中的元素,且无须知道集合中的元素的个数。如图显示了调用foreach方法的客户端和集合之间的关系。数组或集合实现带GetEnumerator()方法的IEnumerable接口。GetEnumerator()方法返回一个实现lEnumerable接口的枚举,接着foreach语句就可以使用IEnumerable接口迭代集合了。
GetEnumerator()方法用IEnumerable接口定义,foreach语句并不真的需要在集合类中实现这个接口。有一个名为GetEnumerator()的方法它返回实现了IEnumerator接口的对象就足够了。

先定义一个Person类,这个类有自动实现的属性Firstname和Lastname,以及从Object类重写ToString方法和继承泛型接口IEquatable以比较两个对象是否相等,实现泛型接口IComparer以比较两个对象用来排序。
public class Person : IEquatable<Person>,IComparable<Person>
{
public int Id { get; private set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public override string ToString()
{
return String.Format("{0}, {1} {2}", Id, FirstName, LastName);
}
public bool Equals(Person other)
{
if (other == null)
return base.Equals(other);
return this.FirstName == other.FirstName && this.LastName == other.LastName;
}
public int CompareTo(Person other)
{
if (other == null) throw new ArgumentNullException("other");
int result = this.LastName.CompareTo(other.LastName);
if (result == 0)
{
result = this.FirstName.CompareTo(other.FirstName);
}
return result;
}
}
创建一个三个元素的person数组,现对数组进行排序在用foreach循环访问数组中的元素并输出
Person[] persons = {
new Person { FirstName = "Simen03", LastName = "Go" },
new Person { FirstName = "Simen02", LastName = "Go" },
new Person { FirstName = "Simen01", LastName = "Go" }
};
Array.Sort(persons);
foreach (var person in persons)
Console.WriteLine(person);
分析foreach (var person in persons)Console.WriteLine(person);这段代码IL代码
// loop start (head: IL_009b)
IL_008a: ldloc.2
IL_008b: ldloc.3
IL_008c: ldelem.ref
IL_008d: stloc.s person
IL_008f: ldloc.s person
IL_0091: call void [mscorlib]System.Console::WriteLine(object)
IL_0096: nop
IL_0097: ldloc.3
IL_0098: ldc.i4.1
IL_0099: add
IL_009a: stloc.3
IL_009b: ldloc.3
IL_009c: ldloc.2
IL_009d: ldlen
IL_009e: conv.i4
IL_009f: blt.s IL_008a
// end loop










