誰もが学び、コミュニケーションできるASP.NETプロジェクトの寝室管理システムのソースコード
ファイル:n459.com/file/25127180-478966639
以下は関係ありません。
- - - - - - - - - - - - - - - - - - - - - -境界線 - - - ----------------------------------------
長年この業界に携わってきた私は、このLiKuiとLiGuiのペアを体系的に整理していません。
最近、なぜ神の「LUTは実際に同じだ」ということに驚かされました。スキーム1は配列を使用してLURを実装します。手書きのアルゴリズムにはこのインターフェースのペアが含まれます。この機会に、この困難な敵のペアを取り上げます。
IEnumerator
IEnumeratorインターフェイスとIEnumerableインターフェイスの名前は似ています。通常、これら2つのインターフェイスは一緒に使用され、目的は異なります。
IEnumeratorインターフェイスは、クラス内のコレクションに反復関数を提供します。IEnumeratorでは、次の3つのメソッドを実装する必要があります。
MoveNextメソッド:このメソッドは、コレクションインデックスに1を追加し、コレクションの終わりに到達したかどうかを示すbool値を返します。
リセット方法:コレクションインデックスを初期値-1にリセットし、列挙子を無効にします。
現在のメソッド:位置の現在のオブジェクト
IEnumerableを返し
ます。IEnumerableインターフェイスは、foreach反復のサポートを提供します。IEnumerableでは、GetEnumeratorメソッドを実装する必要があります。
public IEnumerator GetEnumerator()
{ return(IEnumerator)this; }どのインターフェイスを使用する必要がありますか?上記のレトリックだけに基づいて、2つのインターフェースの使用シナリオを区別することは困難です。
IEnumeratorインターフェイスは、クラス内のコレクションタイプオブジェクトに対する反復を提供します。
IEnumerableインターフェイスでは、foreachループを使用して列挙できます。
ただし、IEnumerableインターフェイスのGetEnumeratorメソッドはIEnumeratorインターフェイスを返します。IEnumerableを実装するには、IEnumeratorも実装する必要があります。IEnumeratorを実装しない場合、IEnumerableのGetEnumeratorメソッドの戻り値をIEnumeratorインターフェイスに変換することはできません。
英語のルートから:
IEnumeratorインターフェイスは、列挙メソッドを定義する列挙子を
表します。IEnumerableインターフェイスは、オブジェクトが列挙可能であるというプロパティを持っていることを表します。
つまり、IEnumerableを使用するには、クラスがIEnumeratorを実装する必要があります。foreachのサポートを提供する場合は、これら2つのインターフェイスを実装します。
ベストプラクティス
複数の列挙子を作成できるように、ネストされたクラスにIEnumeratorを実装します。
IEnumeratorのCurrentメソッドの例外処理を提供します。
なぜあなたはこれをしたいのですか?
コレクションの内容が変更されると、resetメソッドが呼び出され、現在の列挙子が無効になった直後に、IndexOutOfRangeExceptionが発生します(他の状況でもこの例外が発生する可能性があります)。したがって、Try ... Catchブロックを実行してこの例外をキャッチし、InvalidOperationException例外をスローして、反復中にコレクションの内容を変更できないように促します。
これが、foreachで反復オブジェクトを変更しようとしたときにInvalidOperationExceptionを報告することが多い理由です。
IEnumeratorIEnumerableインターフェイスを実装する例として車のリストを取り上げます
システムを使用する;
System.Collectionsを使用する;
名前空間ConsoleEnum
{ パブリッククラスcars:IEnumerable { private car [] carlist;
//Create internal array in constructor.
public cars()
{
carlist= new car[6]
{
new car("Ford",1992),
new car("Fiat",1988),
new car("Buick",1932),
new car("Ford",1932),
new car("Dodge",1999),
new car("Honda",1977)
};
}
//private enumerator class
private class MyEnumerator:IEnumerator
{
public car[] carlist;
int position = -1;
//constructor
public MyEnumerator(car[] list)
{
carlist=list;
}
private IEnumerator getEnumerator()
{
return (IEnumerator)this;
}
//IEnumerator
public bool MoveNext()
{
position++;
return (position < carlist.Length);
}
//IEnumerator
public void Reset()
{
position = -1;
}
//IEnumerator
public object Current
{
get
{
try
{
return carlist[position];
}
catch (IndexOutOfRangeException)
{
throw new InvalidOperationException();
}
}
}
} //end nested class
public IEnumerator GetEnumerator()
{
return new MyEnumerator(carlist);
}
}
}
車を探すと、はっきりと見えます
Foreach構文シュガー最初にcarsに連絡するとき、実際には、carsによって実装されたGetEnumerator()メソッドに入ります。foreachの
各反復は、実際にはCurrentプロパティのgetアクセサーに入ります。