【C#】IEnumeratorを継承したクラスがない。

  • 2011.05.15 Sunday
  • 13:22
JUGEMテーマ:コンピュータ


    class Program
    {
        static void Main()
        {
            var list = new MyList<int> { 1, 2, 3 };

            IEnumerator current = list.GetEnumerator();
            while (current.MoveNext())
            {
                Console.WriteLine(current.Current);
            }
        }
    }

    public class MyList<T> : IEnumerable<T>
    {
        private ListNode<T> _first;
        private ListNode<T> _last;

        public void Add(T value)
        {
            var node = new ListNode<T> { Value = value };
            if (_first == null)
                _first = _last = node;
            else
                _last = _last.Next = node;
        }

        private IEnumerable<T> GetEnumerable()
        {
            for (ListNode<T> currentNode = _first; currentNode != null; currentNode = currentNode.Next)
            {
                yield return currentNode.Value;
            }
        }

        public IEnumerator<T> GetEnumerator()
        {
            return GetEnumerable().GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerable().GetEnumerator();
        }
    }

    class ListNode<TK>
    {
        public TK Value { get; set; }
        public ListNode<TK> Next { get; set; }
    }

上記のコードはhttp://pro.art55.jp/?eid=1303805で紹介したコードを動的なものから静的なものに変換して、さらにIEnumerableを継承させたものです。一部メソッドが消えていたりして微妙に違うところもありますが、大体同じです。

このコードを書き終えて気づきました。IEnumerator インターフェースを継承したクラスを自分で実装していないことに・・・。「あれ?実装しなくてもいけるの?」と、狐につままれた気分です。そもそも元々書いてたコードにはIEnumerableを継承したクラスすらなかった訳ですが・・・・

yield return当たりがなんだかがんばってくれているのだとは思いますが、狐はどこにいるんでしょうか・・・調べる価値がありそうです。

コンパイル後のILをみるとかyield returnを使わずに記述してみるとか

そのへんを探ってみたら答えが出そうな気が済ます(やってませんが・・・)

以前の投稿を探してみるとListを自作しているコードを見つけました。
http://pro.art55.jp/?eid=1175888

using System.Collections;
using System.Collections.Generic;

namespace Art55.Lib
{
 public class C<T> : IEnumerable<T>
 {
  public void Add(T value)
  {
   ListNode<T> tail = ListItemUtil<T>.GetTail(_head);
   if (_head == null)
    _head = new ListNode<T>(value);
   else
    tail.Next = new ListNode<T>(value);
  }

  public IEnumerator<T> GetEnumerator()
  {
   return new E<T>(_head);
  }

  IEnumerator IEnumerable.GetEnumerator()
  {
   foreach (var item in this)
    yield return item;
  }

  private ListNode<T> _head;
 }

 internal class E<T> : IEnumerator<T>
 {
  public E(ListNode<T> item)
  {
   _top = item;
  }

  public bool MoveNext()
  {
   if (_current == null)
    Reset();
   else
    _current =_current.Next;
   return _current != null;
  }

  public void Reset()
  {
   _current = _top;
  }

  public T Current
  {
   get { return _current.Value; }
  }

  object IEnumerator.Current
  {
   get { return Current; }
  }

  public void Dispose()
  {
  }

  private readonly ListNode<T> _top;
  private ListNode<T> _current;
 }

 internal class ListNode<T>
 {
  public ListNode(T value)
  {
   Value = value;
  }

  internal protected ListNode<T> Next { get; set; }
  public T Value { get; private set; }
 }

 static class ListItemUtil<T>
 {
  public static ListNode<T> GetTail(ListNode<T> head)
  {
   if (head == null)
    return null;
   while (head.Next != null)
    head = head.Next;
   return head;
  }
 }
}


internal class E<T> : IEnumerator<T>を一生懸命自作しているわけですが、実はいらなかったんですね。

コメント
コメントする








    
この記事のトラックバックURL
トラックバック

calendar

S M T W T F S
 123456
78910111213
14151617181920
21222324252627
28293031   
<< July 2019 >>

あわせて読みたい

あわせて読みたいブログパーツ

selected entries

categories

archives

recent comment

  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    art55 (05/22)
  • 【キーボード】6年前のRealForceを復活させることはできる!?その3
    分解大好き (05/18)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/04)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    Gen (02/04)
  • 【キーボード】RealForce が壊れて帰ってきた。
    art55 (04/29)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    art55 (02/23)
  • 【.NET Framework 4.5】 IListがIReadOnlyListを継承してない理由。
    かるあ (02/22)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    art55 (01/16)
  • 【C#】Dictionaryの実装・データ構造・アルゴリズムを観察する。
    karuakun (01/16)
  • 【NetOffice】【Excel】死なないExcelプロセスをKillする。
    art55 (12/05)

recent trackback

recommend

recommend

recommend

C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION)
C#プログラマのための.NETアプリケーション最適化技法 (Programmer's SELECTION) (JUGEMレビュー »)
Sasha Goldshtein,Dima Zurbalev,Ido Flatow,サシャ・ゴルドシュタイン,ディマ・ズルバレフ,イド・フラトー

recommend

ろんりと集合
ろんりと集合 (JUGEMレビュー »)
中内 伸光
とてもわかりやすいです。

recommend

recommend

シャノン・ノイマン・ディジタル世界
シャノン・ノイマン・ディジタル世界 (JUGEMレビュー »)
市川 忠男
4章がリレーショナルデータベースな内容になってます。ページ数があまりありませんが、ポイントがものすごく的確にまとまっていて、感動します。

recommend

recommend

東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS
東プレ Realforce91UBK-S 静音キーボード 静電容量無接点方式 変荷重 ブラック NG01BS (JUGEMレビュー »)

テンキーレス、静音のRealForce91UBK-S。スコスコ感がたまらなく気持ちいいです。家と会社で2台持ってます。

recommend

recommend

プログラミング.NET Framework 第4版 (プログラミングシリーズ)
プログラミング.NET Framework 第4版 (プログラミングシリーズ) (JUGEMレビュー »)
Jeffrey Richter
発売予定美 2013年10月10日。.NET Frameworkとお付き合いする人のバイブルですね。

recommend

recommend

キャット・シッターの君に。
キャット・シッターの君に。 (JUGEMレビュー »)
喜多嶋 隆
私のイラストレータデビュー本です。

recommend

Essential .NET ― 共通言語ランタイムの本質
Essential .NET ― 共通言語ランタイムの本質 (JUGEMレビュー »)
ドン・ボックス,クリス・セルズ,Don Box,Chris Sells,吉松 史彰

links

profile

search this site.

others

mobile

qrcode

powered

無料ブログ作成サービス JUGEM