10

SortedDictionary<TK, TV>.NETを使用していて、期待どおりに列挙するように列挙したい場合はどうすればよいICollection<KeyValuePair<TK, TV>>ですか?

つまりKeyValuePair<TK, TV>、最も低いキーが最初に返され、次にKeyValuePair<TK, TV>2番目に低いキーが返されます。

注:参照によってバックアップされた回答のみが受け入れられます。

4

3 に答える 3

11

GetEnumeratorのリファレンスから:

「辞書は内部ツリーを使用してソートされた順序で維持されます。すべての新しい要素は正しいソート位置に配置され、要素が削除されるたびにソート順を維持するようにツリーが調整されます。列挙中、ソート順は維持されます。 「」

具体的には、「列挙している間、並べ替え順序は維持されます。」

于 2011-04-23T16:48:23.357 に答える
4

はい、確かにそうですが、これを正確に説明するドキュメントを見つけるのは非常に困難です。

このタイプの4つのオーバーロードのそれぞれのドキュメントには、GetEnumerator「コレクションを反復処理する列挙子」を返すことについて漠然とした記述がありますが、同等の(キーでソートされた)シーケンスを生成する必要があることは明らかです。ソートされた辞書は、「キーでソートされたキーと値のペアのコレクションを表す」ことを意味していることに注意してください。たとえば、コレクションがループとLINQ to Objectsクエリの間で完全に異なる動作(つまり、列挙順序が異なる)である場合、ユーザーにとっては非常に直感的でなく、混乱を招きますforeach

私ができる最善のことは、あなたGetEnumeratorが興味を持っていると思われる2つのメソッドの実装を提供することです(.NET 4.0以降)。それらは同一です-それらは、コンストラクターに対して同じ引数をEnumerator持つ、ネストされたタイプのインスタンスを返します。唯一の違いは、2番目のオーバーロードでのstruct-typeのボクシングです。

// Used when you do foreach(var kvp in dict) { ... }

public Enumerator<TKey, TValue> GetEnumerator()
{
    return new Enumerator<TKey, TValue>
                ((SortedDictionary<TKey, TValue>) this, 1);
}

// Used when you do:
// foreach(var kvp in (ICollection<KeyValuePair<TKey, TValue>>)dict) { ... }
// or use LINQ to Objects on the collection.

IEnumerator<KeyValuePair<TKey, TValue>> 
IEnumerable<KeyValuePair<TKey, TValue>>.GetEnumerator()
{
    return new Enumerator<TKey, TValue>
                ((SortedDictionary<TKey, TValue>) this, 1);
}

実際、実装がわずかにGetEnumerator異なる唯一のオーバーロードはメソッドです。これにより、コンストラクター呼び出しの引数が変更され、結果の列挙子がインスタンスではなくインスタンスを生成するようになります。もちろん、列挙の順序は他のオーバーロードの場合と同じです。IDictionary.GetEnumeratorDictionaryEntryKeyValuePair<,>

于 2011-04-23T16:18:19.653 に答える
1

IComparerキーを渡さないと仮定すると、キーのデフォルトの実装に依存します。

SortedDictionary(Of TKey、TValue)では、キー比較を実行するために比較機能の実装が必要です。比較パラメーターを受け入れるコンストラクターを使用して、IComparer(Of T)ジェネリックインターフェイスの実装を指定できます。実装を指定しない場合は、デフォルトのジェネリック比較子Comparer(Of T).Defaultが使用されます。タイプTKeyがSystem.IComparable(Of T)ジェネリックインターフェイスを実装している場合、デフォルトの比較プログラムはその実装を使用します。

Remarksページのセクションを見てSortedDictionary<TKey, TValue>ください。

したがって、キーがである場合、実装が使用される場合はstring、の文字​​列実装が使用されます。IComparableint32int32

于 2011-04-23T16:01:15.220 に答える