C_sharp / ProgTips / ForeachOfOwnClass



はじめに

  • foreachを利用するにはそのクラスが IEnumerable からの派生クラスでなくてはならない。
  • すなわち以下のインターフェイスの実装を行うことによりforeachが利用可能。
  • 例はサンプルで。

IEnumerable クラス概要

public interface IEnumerable
{
    IEnumerator GetEnumerator();  // 要素列挙に利用する IEnumerator を返す
}

IEnumerator 概要

public interface IEnumerator
{
    object Current { get; }  // 現在位置の要素を返す
    bool MoveNext();         // 次要素へポインタ移動
    void Reset();            // ポインタリセット
}

サンプルコード

/// <summary>
/// 自作リストクラス MyList
/// </summary>
class MyList : IEnumerable
{
    object[] datas;  // 要素

    /// <summary>
    /// MyList
    /// </summary>
    public MyList(object[] datas)
    {
        this.datas = datas;
    }

    /// <summary>
    /// GetEnumerator
    /// </summary>
    public IEnumerator GetEnumerator()
    {
        return new MyEnumerator(this.datas);
    }
}

/// <summary>
/// MyListを列挙するために作成するクラス MyEnumerator 
/// </summary>
class MyEnumerator : IEnumerator
{
    private int cursor = -1;  // 要素ポインタ現在位置
    object[] elements;        // 要素

    /// <summary>
    /// MyEnumerator
    /// </summary>
    public MyEnumerator(object[] elements)
    {
        this.cursor = -1;
        this.elements = new object[elements.Length];
        System.Array.Copy(elements, this.elements, elements.Length);  // スナップショットを利用する
    }

    /// <summary>
    /// Current
    /// </summary>
    public object Current
    {
        get 
        {
            if (this.cursor > (this.elements.Length - 1))
            {
                throw new System.InvalidOperationException();
            }
            else if (this.cursor == -1)
            {
                throw new System.InvalidOperationException();
            }
            return this.elements[this.cursor];
        }
    }

    /// <summary>
    /// MoveNext
    /// </summary>
    public bool MoveNext()
    {
        this.cursor++;
        if (cursor > (this.elements.Length - 1))
        {
            return false;
        }
        return true;
    }

    /// <summary>
    /// Reset
    /// </summary>
    public void Reset()
    {
        this.cursor = -1;
    }
}

利用例


コード

// foreachを利用する
MyList myList = new MyList(new object[] { "aaa", "bbb", "ccc" });
foreach (string data in myList)
{
    Console.WriteLine(data);
}

出力

aaa
bbb
ccc

MenuBar


最新の20件

2015-05-15 2014-12-07 2008-11-17 2007-08-30 2007-04-21 2007-03-13 2007-03-12 2007-02-20 2007-02-14 2007-02-04 2006-11-26 2006-11-23 2006-11-20 2006-11-18 2006-11-13

  • counter: 417
  • today: 1
  • yesterday: 0
  • online: 1