2013-09-03 21 views
7

私はC#とLINQの専門家ではありません。ToDictionaryを使用してソート済み辞書を作成する

私はDictionaryを持っています。私はハッシュテーブルを理解しています。すなわち、キーはソートされていません。

dataBase = new Dictionary<string, Record>() 

Record与えられたキー文字列のデータの数を保持するユーザ定義のクラスです。このコードは正しく動作

var sortedDict = (from entry in dataBase orderby entry.Key ascending select entry) 
.ToDictionary(pair => pair.Key, pair => pair.Value); 

私はこの Dictionary には、LINQで辞書をソート変換興味深い例を見つけました。結果の sortedDictはキーでソートされます。

質問:私はsortedDictがまだハッシュテーブルであることを見出し、のタイプ:Iが得られた辞書は、一般として実装されているC++ STLのようmapの一種であるべき予想

System.Collections.Generic.Dictionary<string, Record> 

キーの順序を維持するための(バランスの取れた)バイナリツリー。ただし、結果の辞書は依然としてハッシュテーブルです。

sortedDictはどのように注文を維持できますか?ハッシュテーブルはキーの順序を保持できません。一般的なハッシュテーブル以外のC#の実装はGeneric.Dictionaryですか?

+1

は、あなたがそれをよりアクセシブルにしたいならば、あなたはIEnumerableをへの拡張を書き込むことができ、new SortedDictionary<string, Record>(yourNormalDictionary);

を使用し、ソートされた辞書を取得します'Dictionary'を求めて取得しました。あなたがソートされたDiecionaryを維持したい場合は、私が知っている 'SortedDictionary'を使用してください。 – TheEvilPenguin

+1

しかし、私は最後の瞬間にソートされた辞書が必要です。私の質問は、どのように 'Dictionary'が注文を維持できるかということです。これは私には奇妙です。LINQコードは、*ソートされた*辞書を実際に構築しますが、その型はまだ辞書です。 – minjang

+0

linqは 'Dictionary'をソートするだけで、' SortedDictionary'を作成しません –

答えて

7

Dictionaryを使用することができる2つのデータ構造を維持して拡張メソッド作ることができます:検索の列挙のための挿入順に保持されますフラット配列、およびハッシュテーブルをキーで

並べ替えられたセットでToDictionary()を使用すると、列挙されると順番になりますが、順序は維持されません。新しく挿入されたアイテムは列挙時に追加されます。

編集:この動作に依存したい場合は、MSDNドキュメントを参照して、これが保証されているか偶発的なものかを確認することをおすすめします。

7

SortedDictionaryはコンストラクタ内に既存のDictionaryを取り入れ、SortedDictionaryを作成するのは非常に簡単です。

しかし、あなたは、あなたが望むならば、あなたはdataBase.ToSortedDictionary()

public static SortedDictionary<K, V> ToSortedDictionary<K,V>(this Dictionary<K, V> existing) 
{ 
    return new SortedDictionary<K, V>(existing); 
} 
2

linqコードはソートされた辞書を作成するように見えますが、ソートは辞書自体ではなくlinqによって行われますが、SortedDictionaryはソート自体を維持する必要があります。あなたは、 `` ToDictionary()を使用することにより

public static class Extensions 
{ 
    public static SortedDictionary<T1, T2> ToSortedDictionary<T1, T2>(this IEnumerable<T2> source, Func<T2, T1> keySelector) 
    { 
     return new SortedDictionary<T1, T2>(source.ToDictionary(keySelector)); 
    } 
} 
関連する問題