foreach は一部のデータ型を走査できます。図からわかるように、トラバースされるデータ型にはパブリック メソッド GetEnumerator が必要です。
foreach トラバーサルを使用する場合、var 推論タイプが関係します。現時点でジェネリック バージョンが実装されていない場合は、常にオブジェクト タイプになります。
foreach トラバーサルはデータを読み取ることのみできますが、データを変更することはできません。文字列を介して検出できますが、それを構成する文字は変更できません。 (このシナリオのみ)。
foreach は、データベースを操作する DataReader の Read メソッドと同様に、前方へのみトラバースして 1 つずつ読み取ります。
上記の分析から、IEnumerator メソッドをトラバースするにはクラス内で定義する必要があることがわかります。ここには 2 つの解決策があります。
メソッド 1、yield
yield 戻り式を介して、戻り値が IEnumerable
戻り値が IEnumerator
これを使用して、トラバース時に上の図の person 配列の値を取得できます。
方法 2 IEnumerable インターフェイスを実装することで、
IEunmerable に GetEunmetator メソッドが含まれ、戻り値は IEnumerator の型になります。
現時点では、目的を達成するためにそのサブクラスを返すことができるように、IEnumerator インターフェイスを継承する別のクラスが必要です。
実装プロセス:
1. インデックスの位置をマークするために、int 型の変数を追加する必要があります。ここでは int Position=-1 を使用します。
2. 渡された配列を受け取るために、対応する配列変数を追加します。ここで string[] persion;
3 を使用して実装された Curren 属性は、現在のインデックスのデータを返す必要があります。 return person[position];
4. MoveNextメソッドを実装するには、ポインタ(インデックス)に1を加算して前に進む必要があります。戻り値は、インデックスが操作されたかどうかを判断するために使用されます。 。
5. リセット メソッドである Reset メソッドを実装し、位置を -1 に割り当てます。
6. 渡されたデータを受け取るコンストラクターを追加します。
3. リスト コレクションの分析
リフレクション ツールを通じて、List コレクションの Add メソッドが内部項目に値を追加することであり、この項目が配列であることがわかります。ジェネリックなのでTと表示されます。
つまり、上記の自己定義配列と同様に、追加されたデータを格納するための変数がコレクション内に存在します。このように、List コレクション クラスは上記の
カスタム クラスと一致するだけです。プロセスをデモするために、もちろんビジネス ニーズに応じて、静的データの Add メソッドへの変更、データ ロジックのフィルタリングなど、上記のクラスを自分で実装および拡張できます。これらはすべて、ビジネス ニーズに応じて拡張できます。
以上がC# の foreach コード例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。