|
Exemple 14-50 extrait du chapitre Les mécanismes utilisables dans C#
Exemple 14-49< > Exemple 15-1
Cet exemple peut être compilé avec la ligne de commande: csc.exe /target:exe Exemple_14_50.cs Erreurs: 0 Avertissements: 0 Remarque:
Exemple_14_50.cs
using System;
using System.Collections.Generic;
class Program {
static public IEnumerable<int> PipelineIntRange(int begin, int end){
System.Diagnostics.Debug.Assert(begin < end);
for (int i = begin; i <= end; i++)
yield return i;
}
static public IEnumerable<int> PipelinePrime(IEnumerable<int> input){
using (IEnumerator<int> e = input.GetEnumerator()){
e.MoveNext();
int premier = e.Current;
// Le premier nombre obtenu est forcément un premier.
Console.WriteLine(premier);
if (premier != 0){
while (e.MoveNext()){
// Elimine tous les multiples de premier.
if (e.Current % premier != 0)
yield return e.Current;
}
}
}
}
const int N = 100;
static void Main() {
// Applique la formule de Gauss/de la Vallée Poussin
// pour obtenir le nombre d'itérateur.
int N_PREMIER = (int)Math.Floor( ((double)N)/Math.Log(N) );
// Produit un pipeline de N_PREMIER PipelinePrime
// chainé avec un PipelineIntegerRange.
// Chaque appel à PipelinePrime produit un itérateur.
List<IEnumerable<int>> list = new List<IEnumerable<int>>();
list.Add(PipelinePrime( PipelineIntRange(2, N)) );
for( int i=1 ; i<N_PREMIER ; i++ )
list.Add( PipelinePrime(list[i-1]) );
// Traverse toutes les valeurs du dernier itérateur dans la chaine
// afin de provoquer la cascade des calculs.
foreach ( int i in list[N_PREMIER-1]);
}
}
Copyright Patrick Smacchia 2006 2007
|