1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace yieldTest
{
// yield avec une classe implémentant l'interface IEnumerable<T>
class Fibonacci : IEnumerable<int>
{
private int[] _numbers = new[] { 0, 1, 1, 2, 3, 5, 8, 13, 21 };
public IEnumerator<int> GetEnumerator()
{
for( var index=0; index < this._numbers.Length; index++ )
{
yield return this._numbers[index];
}
}
// IEnumerable<T> héritant de IEnumerable, il est nécessaire d'implémenter cette méthode retournant un IEnumerable.GetEnumerator()
// Question :
// Pourquoi ne précise-t-on pas la visibilité de cette méthode (ni public, protected, etc...) ?
// Par défaut, la visibilité devrait être private MAIS si on place un "private" au debut de la déclaration de la méthode : erreur à la compilation
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return (System.Collections.IEnumerator) this.GetEnumerator();
}
}
class Program
{
// yield cas simple d'une fonction
static IEnumerable<int> GetFibonacci()
{
int[] _numbers = new[] { 0, 1, 1, 2, 3, 5, 8, 13, 21 };
for( var index=0; index < _numbers.Length; index++ )
{
yield return _numbers[index];
}
}
static void Main(string[] args)
{
foreach(var i in GetFibonacci() )
{
System.Console.WriteLine( i );
}
System.Console.WriteLine( "---" );
foreach(var i in new Fibonacci() )
{
System.Console.WriteLine( i );
}
System.Console.ReadLine();
}
}
} |
Partager