24

私はIReadOnlyCollectionオブジェクトのを扱っています。

linq拡張メソッドを使用できるので、少し驚いていますElementAt()。しかし、私はにアクセスできませんIndexOf()

私にはこれは少し非論理的に見えます: 特定の位置で要素を取得できますが、まったく同じ要素の位置を取得することはできません。

それには具体的な理由がありますか?

私はすでに読んだ -> IEnumerable の要素のインデックスを取得する方法は? 私はその反応に完全に満足していません。

4

5 に答える 5

4

IndexOfは で定義されたメソッドですが、 はListだけIReadOnlyCollectionを継承しIEnumerableます。

これは、IEnumerableエンティティを反復するためだけにあるためです。ただし、この概念にはインデックスは適用されません。これは、順序が任意であり、呼び出し間で同一であることが保証されていないためですIEnumerable。さらに、インターフェースは単にコレクションを反復Listできることを示していますが、追加と削除も実行できる状態です。

メソッドはElementAt確かにこれを行います。ただし、列挙全体を繰り返して 1 つの要素を見つけるため、使用しません。より適切に使用するFirstか、単にリストベースのアプローチを使用してください。

とにかく、API 設計はn番目の位置で要素を取得する (非効率的な) アプローチを許可するが、任意の要素のインデックスを取得することを許可しないため、私には奇妙に思えます。 . 私は両方(私はお勧めしません)またはどちらにも同意しません。

于 2016-05-25T08:40:50.217 に答える
4

これは、IReadOnlyCollection(を実装するIEnumerable) が必ずしも を実装するとは限らないindexingためですListIndexOfからIListです。

Dictionaryたとえば、インデックスのないコレクションを考えてみてください。 には数値インデックスの概念はありませんDictionary。ではDictionary、順序は保証されません。キーと値の間の 1 対 1 の関係のみです。したがって、コレクションは必ずしも数値インデックスを意味するわけではありません。

もう 1 つの理由は、IEnumerable実際には双方向のトラフィックではないためです。このように考えてください:IEnumerableは、指定した回数だけ項目を列挙して(つまり)xの要素を見つけることができますが、その要素のいずれかがどのインデックス (つまり) にあるかどうかを効率的に知ることはできません。xElementAtIndexOf

しかし、そうです、あなたがそれをこのように考えても、それが両方を持っているElementAtIndexOf または何も持っていないことを期待していても、それはまだかなり奇妙です.

于 2016-05-25T08:41:15.197 に答える