したがってIEnumerable
、順序を保証するものではありません。
それは、あなたがそうするなら、あなたがmyEnumerable.Skip(5)
(あなたがそうしない限り、.ToList()
または以前にそうしない限り)何が返されるかを保証できないということですか?
オブジェクトが によって生成されると、オブジェクトにはIEnumerator
順序があります。最初に出てくる項目と、2 番目に出てくる項目などがあります。特定の実装では、順序が意味を持つ場合もあれば、恣意的である場合もありますが、それでもある程度の順序はあります。Skip
実装は簡単です。ただし、アイテムを生成せずに多くのアイテムを取得し、残りを取得して生成します。スキップされたアイテムが特に何かを意味するかどうかは、メソッドを呼び出す人の責任です。
呼び出しToList
によってシーケンス内の項目の順序が変更されることはないため、呼び出しの前にそのような呼び出しを追加してSkip
も何も変更されません。OrderBy
一方、 を呼び出すと、順序が変更され、意味のない順序から意味のある順序になる可能性があります。これは、必須であると言っているわけではなく、状況によっては便利なツールになる可能性があるというだけです。
特定の順序付けが特定によって保証されているかどうかはIEnumerable<T>
、
配列は、その内容を明らかな順序 (からx[0]
までx[n]
) で列挙します。a についてもList<T>
同様で、基本的には長さを調整できる配列です。もちろん、実際の [リンクされた] リストは、順番にしか列挙できません。
Dictionary<K,V>
、 、二分木などの列挙の順序はHashSet<T>
、オブジェクトが追加された順序に依存します。順序が異なる同じ値のコレクションをバイナリ ツリーに追加すると、このように構築されたツリーの構造が異なります (もちろん、オブジェクトが順番に追加される場合は退化したケースであり、この場合、ツリー構造は [順序付けられた] リンクされたリスト。
つまり、 の特定のインスタンスはIEnumerable<T>
、基になるコレクションへの変更を除いて、列挙されるたびに同じ値のシーケンスを生成する必要があります。もちろん、これはインターフェースの合理的な実装を前提としています。もちろん、インターフェイスがランダム シャッフルを実行してコレクションを列挙する場合、すべての賭けはオフになります。
生産されるアイテムの実際の順序が重要な場合は、次のいずれかを行う必要があります