C# 入門 & 実践 / C sharp
4-8. [ ジェネリック/コレクション ] 2. インターフェイスの実装 / IEnumerable で foreach を実装
IEnumerable ジェネリックインターフェイスを実装した、ジェネリッククラス BbGeneric を作ってみます。
public class BbGeneric<T> : IEnumerable<T>
{
private T[] ts;
private int ctr = 0;
public BbGeneric(T[] args)
{
ts = new T[args.Length];
for( int i=0; i<args.Length; i++)
{
ts[i] = args[i];
}
}
#region IEnumerable<string> メンバ
// 列挙可能なクラスは・・・列挙子を返すことが出来る・・・
public IEnumerator<T> GetEnumerator()
{
foreach (T s in ts)
{
yield return s;
}
}
#endregion
#region IEnumerable メンバ
IEnumerator IEnumerable.GetEnumerator()
{
throw new Exception("The method or operation is not implemented.");
}
#endregion
}
class Tester
{
static void Main()
{
string[] str = { "朝", "昼", "夕", "夜" };
foreach (string x in str)
{
Console.WriteLine("str : {0}", x);
}
// stringで生成!
BbGeneric<string> bb = new BbGeneric<string>(str);
foreach (string x in bb)
{
Console.WriteLine("bb : {0}", x);
}
// 今度は int で生成!
int[] i_s = { 1,2,3,4,5 };
BbGeneric<int> bb_i = new BbGeneric<int>( i_s );
foreach ( int x in bb_i )
{
Console.WriteLine("bb_i : {0}", x);
}
}
}
str : 朝
str : 昼
str : 夕
str : 夜
bb : 朝
bb : 昼
bb : 夕
bb : 夜
bb_i : 1
bb_i : 2
bb_i : 3
bb_i : 4
bb_i : 5
とこのように自分の作ったクラスで foreach を実装できました^-^。
yield return s; もポイントですね
yield の使用は、IEnumerable インターフェイスで GetEnumerator メソッドを実装するのが最も一般的な方法だそうですので、
今回の使い方を覚えておけば問題ないようです。
yield : 列挙子オブジェクトに値を挿入する場合、または反復処理の終了を通知する場合に、iterator ブロック内で使用されます。形式は次のいずれかになります。
yield return expression;
yield break;
4-7. [ ジェネリック/コレクション ] 1. ジェネリックの基本 «
4. C# 入門 Level 2 »
4-9. [ ジェネリック/コレクション ] 3. 制約
C# 入門 & 実践 / C sharp