日記帳だ! with Tux on Libserver

二度目の大改造!! 日記帳…か?を継承し、より柔軟でパワフルなBlogに変身しました。

RSSに対応しています。リンク・コメント・トラックバックは自由にしていただいてほぼ問題ありません。
RSS購読方法、僕のリンク・コメント・トラックバックについての考えを読むことをおすすめします。

<< 過去

未来 >>

即席foreach可能オブジェクト

C#でIEnumerableインターフェースを実装するのに便利な、yieldキーワード。
と、yieldキーワードを使った例をここでは一度も書いてないか…
  class foo : IEnumerable<bar> {
public IEnumerator<bar> GetEnumerator() {
for (int i=0; i<elements.Count; i++) {
yield return elements[i];
}
yield break;
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
return GetEnumerator();
}
こんな風に簡単にGetEnumeratorメソッドを実装できるわけです。
便利ですね。
yield returnは1つ渡す、yield break;はこれで終わりの意味。
これができるまではIEnumeratorを実装したクラスを自作する必要があったのでめんどくさい。
以前僕もこうやってやってたのだがあまりにめんどくさい。
まぁこんな風に簡単にforeach可能なクラスを作ることができると。
これはかなりありがたい事実です。
しかし、なんとIEnumerableを実装したクラスを作ることなく、foreach可能なオブジェクトを作ることができると。
まぁ百聞は一見にしかずという言葉を信じて、まず見てもらおう、
    static public void Main(string[] args) {
foreach (int i in FromTo(1, 10000)) {
Console.WriteLine(i);
}
Console.ReadKey(true);
}
public static IEnumerable<int> FromTo(int f, int t) {
if (t<f) throw new ArgumentException();
for (int i=f; i<=t; i++) {
yield return i;
}
}
IEnumerable<int>型を返り値にするメソッドの中で、yieldを使って書くと。
こうすれば、IEnumerableを実装したクラスも、IEnumeratorを実装したクラスもなしに、
急にforeach可能なオブジェクトを作れる。
これは結構驚いた。けど確かにMSDNにはそう書いてある。
それを活用して作ったのがMainメソッドの。
もちろんこれはPerlのこれにちなんだもの。
foreach(1..10000){ print "$_\n"; }
ここでは1..10000を一旦配列として作る。
しかしこの、IEnumerableにせよ、IEnumeratorにせよ、よいのは、配列を作る必要もないということ。
だから工夫次第ではかなり有益なものが作れる。
まぁ今回の例はあまりおもしろくないですけど。
しかし非常に時間のかかる、1つ1つ取り出す動作をこうやって書くと、
なかなかおもしろいことができると書いてあったのを見たことがある。
これだけおもしろいものが簡単に書けるのだから便利ですね。
Author : Hidemaro
Date : 2008/07/26(Sat) 22:00
コンピュータ・インターネット | Comment | trackback (0)
blog comments powered by Disqus

トラックバック

トラックバックURL取得

Tools