genericsを使ったIEnumerator<T>インターフェイスの実装方法はこちらの記事を参照してください
IEnumerator.GetEnumerator()
メソッドをクラスに実装する必要があります。MoveNext
Reset
Current
IEnumerator.Current
を実装します。using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CustomIEnumerator
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
MyClass m = new MyClass();
foreach (int i in m) {
textBox1.Text += Convert.ToString(i)+"\r\n";
}
}
}
}
using System.Collections;
namespace CustomIEnumerator
{
class MyClass : IEnumerable
{
IEnumerator IEnumerable.GetEnumerator()
{
return new MyClassProc();
}
}
}
using System.Collections;
namespace CustomIEnumerator
{
class MyClassProc : IEnumerator
{
int index;
public bool MoveNext()
{
index++;
if (10 < index)
{
return false;
}
else
{
return true;
}
}
public void Reset()
{
index = 0;
}
object IEnumerator.Current
{
get
{
return index;
}
}
}
}
GetEnumerator()
メソッドの実装が必要です。 public interface IEnumerable
{
[Pure]
[DispId(-4)]
IEnumerator GetEnumerator();
}
IEnumerableインターフェイスを実装した、MyClass では、GetEnumerator() メソッドを実装します。 class MyClass : IEnumerable
{
IEnumerator IEnumerable.GetEnumerator()
{
return new MyClassProc();
}
}
class MyClass : IEnumerable
{
public IEnumerator GetEnumerator()
{
return new MyClassProc();
}
}
MyClassProcクラスでは、MoveNext
Reset
Current
IEnumerator.Current
を実装します。false
を返し、次の要素があることを示します。
10以上の場合は、true
を返し要素がないことを示します。 public bool MoveNext()
{
index++;
if (10 < index)
{
return false;
}
else
{
return true;
}
}
public void Reset()
{
index = 0;
}
public int Current
{
get
{
return index;
}
}
object IEnumerator.Current
{
get
{
return index;
}
}