L'avantage de l'itérateur blocs est qu'ils travaillent paresseusement. Vous pouvez donc écrire une méthode de filtrage comme ceci:
public static IEnumerable<T> Where<T>(this IEnumerable<T> source,
Func<T, bool> predicate)
{
foreach (var item in source)
{
if (predicate(item))
{
yield return item;
}
}
}
Qui va vous permettre de filtrer les flux aussi longtemps que vous le souhaitez, jamais mise en mémoire tampon plus qu'un seul élément à la fois. Si vous avez besoin seulement la première valeur de la séquence retournée, par exemple, pourquoi voulez-vous copier tout dans une nouvelle liste?
Comme autre exemple, vous pouvez facilement créer un infini de flux à l'aide d'itérateur blocs. Par exemple, voici une séquence aléatoire de nombres aléatoires:
public static IEnumerable<int> RandomSequence(int minInclusive, int maxExclusive)
{
Random rng = new Random();
while (true)
{
yield return rng.Next(minInclusive, maxExclusive);
}
}
Comment voulez-vous stocker une séquence infinie dans une liste?
Mon Edulinq blog de la série donne un exemple de mise en œuvre de LINQ to Objects qui les rend lourd utilisation de l'itérateur de blocs. LINQ est fondamentalement paresseux où il peut être - et de mettre les choses dans une liste simplement ne fonctionne pas de cette façon.