2

したがってIEnumerable、順序を保証するものではありません。

それは、あなたがそうするなら、あなたがmyEnumerable.Skip(5)(あなたがそうしない限り、.ToList()または以前にそうしない限り)何が返されるかを保証できないということですか?

4

4 に答える 4

5

オブジェクトが によって生成されると、オブジェクトにはIEnumerator順序があります最初に出てくる項目と、2 番目に出てくる項目などがあります。特定の実装では、順序が意味を持つ場合もあれば、恣意的である場合もありますが、それでもある程度の順序はあります。Skip実装は簡単です。ただし、アイテムを生成せずに多くのアイテムを取得し、残りを取得して生成します。スキップされたアイテムが特に何かを意味するかどうかは、メソッドを呼び出す人の責任です。

呼び出しToListによってシーケンス内の項目の順序が変更されることはないため、呼び出しの前にそのような呼び出しを追加してSkipも何も変更されません。OrderBy一方、 を呼び出すと、順序が変更され、意味のない順序から意味のある順序になる可能性があります。これは、必須であると言っているわけではなく、状況によっては便利なツールになる可能性があるというだけです。

于 2013-09-19T16:56:37.883 に答える
3

特定の順序付けが特定によって保証されているかどうかはIEnumerable<T>

  • その特定の実装がどのように/行われたか、および
  • 基礎となるコレクション/クラスのセマンティクス。

配列は、その内容を明らかな順序 (からx[0]までx[n]) で列挙します。a についてもList<T>同様で、基本的には長さを調整できる配列です。もちろん、実際の [リンクされた] リストは、順番にしか列挙できません。

Dictionary<K,V>、 、二分木などの列挙の順序はHashSet<T>、オブジェクトが追加された順序に依存します。順序が異なる同じ値のコレクションをバイナリ ツリーに追加すると、このように構築されたツリーの構造が異なります (もちろん、オブジェクトが順番に追加される場合は退化したケースであり、この場合、ツリー構造は [順序付けられた] リンクされたリスト。

つまり、 の特定のインスタンスはIEnumerable<T>、基になるコレクションへの変更を除いて、列挙されるたびに同じ値のシーケンスを生成する必要があります。もちろん、これはインターフェースの合理的な実装を前提としています。もちろん、インターフェイスがランダム シャッフルを実行してコレクションを列挙する場合、すべての賭けはオフになります。

生産されるアイテムの実際の順序が重要な場合は、次のいずれかを行う必要があります

  • 目的のセマンティクスを持つコレクションを使用するか、または
  • コレクションまたは列挙を並べ替えて、必要な順序を適用します。
于 2013-09-19T17:37:04.517 に答える