直列つなぎ。 -とある発達障害者の記録

知識と知識を繋ぐためのblog。 広汎性発達と診断されました。ぜんぜん役に立ってないけど。月収13万円、家賃4万円で生活するひつじ人間。

C# イテレーター 

http://ufcpp.net/study/csharp/sp2_iterator.html

 C#のイテレーターは「現在の要素を取得・コレクションの次の要素に進める・列挙子を初期位置に戻す」をまとめてやってくれる。プログラマは変数のフィールドを用意するだけでいい。

 

青地の部分と、Currentフィールドが不要になっている。



using System;
using System.Collections.Generic;

/// <summary>
/// 片方向連結リストクラス
/// </summary>
class LinearList<T>
{
  /// <summary>
  /// 連結リストのセル
  /// </summary>
  private class Cell
  {
    public T value;
    public Cell next;

    public Cell(T value, Cell next)
    {
      this.value = value;
      this.next = next;
    }
  }

  private Cell head;

  public LinearList()
  {
 //初期化用コンストラクタ
    this.head = null;
  }

  /// <summary>
  /// リストに新しい要素を追加
  /// </summary>
  public void Add(T value)
  {
    this.head = new Cell(value, head);
  }

  /// <summary>
  /// 列挙子を取得
  /// </summary>
  public IEnumerator<T> GetEnumerator()
  {
    for(Cell c = this.head; c != null; c = c.next)
    {
      yield return c.value;
//→の青い部分が不要に
//現在の要素を取得・コレクションの次の要素に進める・列挙子を初期位置に戻すをまとめてやってくれる。
    }
  }
}

class ForeachSample
{
  static void Main()
  {
    LinearList<int> list = new LinearList<int>();

    for(int i=0; i<10; ++i)
    {
      list.Add(i * (i + 1) / 2);
    }

    foreach(int s in list)
    {
      Console.Write(s + " ");
    }
  }
}    
using System;
using System.Collections;

/// <summary>
/// 片方向連結リストクラス
/// </summary>
class LinearList : IEnumerable
{
  /// <summary>
  /// 連結リストのセル
  /// </summary>
  private class Cell
  {
    public object value;
    public Cell next;

    public Cell(object value, Cell next)
    {
      this.value = value;
      this.next = next;
    }
  }

  /// <summary>
  /// LinearList の列挙子
  /// </summary>
  private class LinearListEnumerator : IEnumerator
  {
    private LinearList list;
    private Cell current;

    public LinearListEnumerator(LinearList list)
    {
      this.list = list;
      this.current = null;
    }

    /// <summary>
    /// コレクション内の現在の要素を取得
    /// </summary>
    public object Current
    {
      get{return this.current.value;}
    }


    /// <summary>
    /// 列挙子をコレクションの次の要素に進める
    /// </summary>
    public bool MoveNext()

    {
      if(this.current == null)
        this.current = this.list.head;
      else
        this.current = this.current.next;

      if(this.current == null)
        return false;
      return true;
    }

    /// <summary>
    /// 列挙子を初期位置に戻す
    /// </summary>
    public void Reset()
    {
      this.current = null;
    }
  }

  private Cell head;

  public LinearList()
  {
    head = null;
  }

  /// <summary>
  /// リストに新しい要素を追加
  /// </summary>
  public void Add(object value)
  {
    head = new Cell(value, head);
  }

  /// <summary>
  /// 列挙子を取得
  /// </summary>
  public IEnumerator GetEnumerator()
  {
    return new LinearListEnumerator(this);
  }
}

class ForeachSample
{
  static void Main()
  {
    LinearList list = new LinearList();

    for(int i=0; i<10; ++i)
    {
      list.Add(i * (i + 1) / 2);
    }

    foreach(int s in list)
    {
      Console.Write(s + " ");
    }
  }
}


 ・・・とこれぐらい便利な機能。
Cellをint型とか指定しなくて良いとか、いろいろ簡略化できるようだ。 → ジェネリックに依るもの
Cell Nextって書くだけでNextの役割を果たすことが出来るのか? → イテレーターが次の要素に進めてくれるために成り立っている



http://garicchi.hatenablog.jp/entry/2014/09/12/200000

https://code.msdn.microsoft.com/ArrayCollections-howto-3027b3b2
関連記事
スポンサーサイト

 C#

0 Comments

Leave a comment