web-dev-qa-db-ja.com

IEnumerableと順序

IEnumerableの-​​orderについて質問があります。

私が知る限り、IEnumerableを反復処理する擬似コードは次のように記述できます。

_while (enumerable.HasNext())
{
    object obj = enumerable.Current;
    ...
}
_

ここで、sortedコレクションを操作する必要があると仮定します。この場合、IEnumerableを使用できますか、またはインデックス作成サポートを使用して他の手段(つまりIList)を試す方が良いでしょうか?

言い換えると:IEnumerableの契約は一般的な順序について保証をしますか?

したがって、IEnumerableは、順序付けを保証する一般的なインターフェイスの適切な意味ではありません。新しい質問は、どのインターフェイスまたはクラスshouldを順序付きの不変コレクションに使用するかです。 ReadonlyCollectionIList?両方ともAdd()メソッドを含んでいます(前者では実装されていません)。

私自身の考え:IEnumerableは順序に関する保証を提供しません。正しい実装は、異なる列挙で異なる順序で同じ要素を返す可能性があります(SQLクエリを検討してください)

私はLINQ First()を知っていますが、IEnumerableがその順序についてWordを言わない場合、この拡張機能はほとんど役に立ちません。

42
undefined

IEnumerable/IEnumerable<T>は順序については保証しませんが、IEnumerable/IEnumerable<T>を使用する実装は順序を保証する場合と保証しない場合があります。

たとえば、List<T>を列挙する場合、順序は保証されますが、HashSet<T>を列挙する場合、そのような保証は提供されませんが、IEnumerable<T>インターフェイスを使用して両方が列挙されます。

34
spender

実装の詳細。 IEnumerableはアイテムを列挙します-実装方法は実装次第です。 MOSTリストなどは自然な順序で実行されます(インデックス0が上など)。

iEnumerableの契約は、一般的な場合に何らかの順序を保証しますか?

いいえ、列挙のみを保証します(アイテムごとに1回など)。 IEnumerableは、順序付けされていない項目でも使用できるため、順序が保証されていません。

私はLINQ First()について知っていますが、IEnumerableがその順序についてWordを言わない場合、この拡張機能はかなり役に立ちません。

いいえ、固有の順序がある可能性があるため、そうではありません。例としてSQLを指定します-結果はIEnumerableですが、前に(OrderBy()を使用して)順序付けを強制した場合、LINQの定義ごとにIEnumerableが順序付けられます。 AsEnumerable()。First()は、Orderによって最初のアイテムを取得します。

13
TomTom

おそらく IOrderedEnumerable インターフェイスを探していますか? OrderBy()などの拡張メソッドによって返され、ThenBy()を使用した後続のソートを可能にします。

6

列挙と順序の2つのポイントを混ぜます。

IEnumerableを列挙する場合、順序を気にする必要はありません。インターフェイスを操作し、その実装は順序に注意する必要があります。

例えば:

void Enumerate(IEnumerable sequence)
{
    // loop
}

SortedList<T> sortedList = ...
Enumerate (sortedList);

メソッド内では、まだ順序が固定されたリストですが、メソッドは特定のインターフェイスの実装については知らないため、特殊性があります。

4
abatishchev