はじめに †
- 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
最新の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: 415
- today: 1
- yesterday: 0
- online: 1