Коллекция - это класс, содержащий массив/список однотипных элементов. Для перебора коллекции в foreach требуется реализовать интерфейсы IEnumerable, IEnumerator.
Ключевое слово yield сообщает компилятору, что метод, в котором оно содержится, является блоком итератора.Для реализации поведения, определенного в блоке итератора, компилятор создает класс. В блоке итератора ключевое слово yield используется совместно с ключевым словом return для предоставления значения объекту перечислителя, например значения, возвращаемого в каждом цикле оператора foreach. Также ключевое слово yield используется вместе с ключевым словом break для обозначения конца итерации.
Оператор
yieldне может использоваться в анонимных методах.
public IEnumerator GetEnumerator()
{
for (var i = 0; i < collection.Length; i++)
{
yield return collection[i];
}
}
Реализация foreach методами реализованного интерфейса.
IEnumerator enumerator = collection.GetEnumerator();
while(enumerator.MoveNext())
{
string element = enumerator as String;
// user code //
}
foreach (string element in collection)
{
// user code //
}
Подробнее про yield: