1. ホーム
  2. c#

[解決済み] イテレータとエニュメレータの区別

2023-08-28 21:40:18

質問

.NET 3.5の面接での質問は、「イテレータと列挙子の違いは何ですか?

これは、LINQなどで行う中核的な区別です。

とにかく、この違いは何なのでしょうか?ネット上で確かな定義を見つけることができないようです。間違いなく、2 つの用語の意味を見つけることはできますが、微妙に異なる回答が得られます。面接ではどのような答えがベストなのでしょうか?

IMOはイテレータ"イテレート"コレクション上を、列挙者はイテレートする機能を提供しますが、これは呼び出されなければなりません。

また、yieldキーワードを使用すると、状態が保存されると言われています。この状態とは具体的にどのようなものでしょうか?このメリットが発生する例はあるのでしょうか?

どのように解決するのですか?

反復はいくつかのステップを繰り返すことを意味し、列挙は値のコレクション内のすべての値を通過することを意味します。そのため、列挙には通常、何らかの形で反復が必要となります。

このように、列挙は、コレクションから値を取得するステップである反復処理の特殊なケースです。

列挙は再帰的に実行されることもありますが、再帰と反復は非常に密接に関連しているので、この小さな違いは気にしません。

また、明示的にコレクションに保存しない値を列挙することもできます。たとえば、自然数、素数、その他を列挙することができますが、これらの値は列挙中に計算し、物理的なコレクションから取得することはありません。この場合、何らかのロジックで定義された値を持つ仮想的なコレクションを列挙していると理解することができます。


リード・コプシーがポイントをつかんだと仮定します。C#では、何かを列挙するには、2つの主要な方法があります。

  1. 実装する Enumerable を実装したクラスと IEnumerator
  2. イテレータを実装した yield ステートメントで実装します。

最初の方法は実装が難しく、列挙するためにオブジェクトを使用します。2番目の方法は実装が簡単で、継続を使用します。