10

SO で、双方向列挙子を実装する方法について何度か尋ねられました (ここここ)。私の質問は、方法(ほとんどの場合は些細なことです) ではなく、.NET プラットフォームにそのような型が存在しない理由です。

public interface IBidirectionalEnumerator<T> : IEnumerator<T>
{
    bool MovePrev();
}

明らかに、これを実装できない多くのコレクション型があります。これは、MoveNext()破壊的であるか、基になるコレクションの状態を変更するためです。しかし逆に、多くの型はこれを自明に実装できますList( 、IList、)。LinkedListarray

なぜそのようなタイプが存在しないのですか?

4

6 に答える 6

4

フレームワークを設計しているときは、さまざまな抽象化レベルで何かを行うことについて決定を下す必要があります。トレードオフは、物事を高い抽象化レベルで公開することを選択した場合、物事に対するきめ細かな制御を失うという代償を払って一般化を達成することです。より低い抽象化レベルで何かを公開することを選択した場合、概念を一般化することはできませんが、より低いレベルで詳細を制御できます。

設計上の決定です。両方を実装するとコストがかかり、フレームワークが肥大化するため、機能を追加するときに両方をサポートする必要があります。将来的には下位互換性を維持する必要があります。考えられるすべてのことを BCL に追加しても、それが大きな利益をもたらすことを確認しないのは賢明なことではありません。

于 2009-10-20T18:08:48.327 に答える
3
  • IEnumerator は、c# の foreach ステートメントと、他の言語のループ構造をサポートしています。
  • IBidirectionalEnumerator が有効にするステートメントや一般的なプログラミング イディオムはありません。
于 2009-10-20T18:07:10.490 に答える
2

明らかに、これを実装できない多くのコレクション型があります。これは、MoveNext()破壊的であるか、基になるコレクションの状態を変更するためです。

MoveNext()非破壊的です。IEnumerator実際、が作成されてから呼び出されるまでの間に、基になるコレクションの状態が変更されたMoveNext()場合、 への呼び出しMoveNext()は失敗します。

の目的はIEnumerator、コレクションにネイティブな順序がある場合、コレクションのネイティブな順序で、コレクション内のすべての項目を 1 回反復処理することです。IEnumeratorC++ で見られるような、コレクション ナビゲーション デバイスとして意図されたものではありません。

于 2009-10-20T18:16:21.593 に答える
2

誰もそれについて考えなかった、または誰もそれが特に役立つとは思わなかった、または十分な予算がなかったため、または...

それは本当に必要ではありませんね。自分で簡単に実装できます。BCL チームは、実装、テスト、文書化などの手間をかける価値がないと考えたのかもしれません。機能のコストを決して過小評価しないでください。「簡単」に聞こえるかもしれませんが、コストはかかります。

特に、誰も実装していない単一のインターフェースは奇妙に思えるからですよね? List や Array などでインターフェイスを実装すると予想されますが、これは最終的にはかなりの作業になります。

于 2009-10-20T18:02:28.503 に答える
1

より大きな問題は、.Net が IReadableByIndex を実装しない理由です。これは IList によって継承されます。このような型は、読み取り/書き込み IList 実装を生成するために必要な作業に何も追加せず、読み取り専用実装 (IList ではなく IReadableByIndex を実装する) を生成するために必要な作業を削減します。

ただし、そのような「理由」を熟考することはあまり役に立ちません。.Netはそれが何であるかです。.Net 5.0 の状況を改善する唯一の方法は、読み取り/書き込みプロパティを実装するインターフェイスが読み取り専用バージョンを暗黙的に実装すると見なすことができることを宣言する手段を許可することです (IList が共変を継承できるようにするため)。 IReadableByIndex を明示的な Get メソッドを追加する必要はありません)。

于 2011-01-16T15:39:24.440 に答える
1

また、その動機は何でしょう?「後方」反復の言語サポートは?

イテレータ パターンは、一連の要素の「方向性」の概念をあまり重視しません。これは、セットを反復処理するための単純なインターフェイスを提供するための単純なパターンです。

于 2009-10-20T18:06:20.973 に答える