IEnumerableとIEnumerator学習(一):クラスにGetEnumerator()メソッドを追加し、クラスまたはクラスのセットを反復可能にする
2784 ワード
C#では、foreachを使用して配列、Listを巡回するのが便利ですが、foreachを使用して配列を巡回できるのは、システムが自動的に配列にIEnumerableインタフェースを実現し、IEnumerableインタフェースに含まれるGetEnumerator()がIEnumerator反復器を返し、反復配列を可能にするためです.
実際には、カスタムクラスはforeachを使用して特定のコンテンツを巡回することもできます.クラスはIEnumerableインタフェースを継承したり実装したりする必要はありません.GetEnumerator()メソッドを追加するだけです.戻り値はIEnumeratorで、Tはforeachでアクセスするオブジェクトが必要なタイプです.このようなクラスを実装することで、IEnumerableとIEnumeratorインタフェースの理解を深めることができます.
例は次のとおりです.
まずクラスMyGraphicCardsを作成します.クラスにはリストが含まれています.リストに要素を追加する方法AddModelと、現在のリストの長さを知るLength方法が含まれています.
したがって、Mainメソッドではforeachを使用してクラスのリストを巡回することができる.
出力結果は
実際には、カスタムクラスはforeachを使用して特定のコンテンツを巡回することもできます.クラスはIEnumerableインタフェースを継承したり実装したりする必要はありません.GetEnumerator()メソッドを追加するだけです.戻り値はIEnumeratorで、Tはforeachでアクセスするオブジェクトが必要なタイプです.このようなクラスを実装することで、IEnumerableとIEnumeratorインタフェースの理解を深めることができます.
例は次のとおりです.
まずクラスMyGraphicCardsを作成します.クラスにはリストが含まれています.リストに要素を追加する方法AddModelと、現在のリストの長さを知るLength方法が含まれています.
public class MyGraphicCards
{
public List Models = new List();
public void AddModel(string newModel)
{
Models.Add(newModel);
}
public int Length()
{
return Models.Count;
}
public IEnumerator GetEnumerator()// foreach IEnumerator
{
for (int i = 0; i < Models.Count; i++)
{
yield return Models[i];
}
}
public IEnumerable Reverse()//Reverse List , IEnumerable GetEnumerator
{
for (int i = Models.Count-1; i >=0; i--)
{
yield return Models[i];
}
}
public IEnumerable Subset(int index, int length)//Subset List
{
for (int i = index ; i < index + length; i++)
{
yield return Models[i];
}
}
}
したがって、Mainメソッドではforeachを使用してクラスのリストを巡回することができる.
MyGraphicCards myGraphicCardList = new MyGraphicCards();
myGraphicCardList.AddModel("GeForce 8800 Ultra");
myGraphicCardList.AddModel("Radeon HD 5870");
myGraphicCardList.AddModel("GeForce GTX 780 Ti");
myGraphicCardList.AddModel("Radeon R9 Fury X");
foreach (var myModel in myGraphicCardList)
{
Console.WriteLine(myModel);
}
Console.WriteLine();
foreach (var myModel in myGraphicCardList.Reverse())
{
Console.WriteLine(myModel);
}
出力結果は
GeForce 8800 Ultra
Radeon HD 5870
GeForce GTX 780 Ti
Radeon R9 Fury X
Radeon R9 Fury X
GeForce GTX 780 Ti
Radeon HD 5870
GeForce 8800 Ultra
GeForce GTX 780 Ti
Radeon R9 Fury X