2013-10-22 20 views
8

辞書のキーと値を逆にしたいと思います。私はソース辞書Dictionary<int, string>から、私はDictionary<string, List<int>>を取得したいと思います。値は異なるキーのもとで複数回ソース辞書に入れることができるので、List<int>があります。辞書のキーと値の逆順

例:

{ 
    "A": [1,2,3] 
    "B": [4,5] 
    "C": [6] 
    "D": [7] 
} 

助けをありがとう:

{ 
    1: "A" 
    2: "A" 
    3: "A" 
    4: "B" 
    5: "B" 
    6: "C" 
    7: "D" 
} 

はに変換します。

EDIT:

OK、私はこのアルゴリズムについて少し理解することができた皆さんからの助けを借りて。 私は2つの可能な解決策を見ており、その結果が同じであるように見えますが、実際の違いは何か分かりません。

パフォーマンスに問題はありますか?

var byLookup = actions.ToLookup(pair => pair.Value, pair => pair.Key) 
    .ToDictionary(group => group.Key, group => group.AsEnumerable()); 
var byGroupBy = actions.GroupBy(pair => pair.Value, pair => pair.Key) 
    .ToDictionary(group => group.Key, group => group.AsEnumerable()); 

EDIT 2:

私はちょうど

var byLookup = actions.ToLookup(pair => pair.Value, pair => pair.Key) 

を使用して終了し、私はそれが、この単純なことだろうと予想しませんでした。 ありがとうございます。

var res = dict 
    .GroupBy(p => p.Value) 
    .ToDictionary(g => g.Key, g => g.Select(pp => pp.Key).ToList()); 

まず、あなたがグループ値によって:

+1

あなたが作成しようとしています辞書からの検索?これが当てはまる場合、ToLookup()拡張メソッドはあなたの友人です。 – Baldrick

+1

@B ...私はそれを理解しようとしましたが、すべてのパラメータとオーバーロードでGroupByメソッドに頭を下げることができませんでした。 – sidon

+0

'var byLookup = actions.ToLookup(pair => pair.Value、pair => pair.Key)'だけで十分ですが、ToDictionaryを呼び出す必要はありません。 –

答えて

23

は、これはかなり単純なLINQ式です。これは、キーとして文字列を含むグループを作成し、項目としてKeyValuePair<int,string>を作成します。

グループのキーを辞書キーに使用し、元の辞書のキーをToList()のリストに「平準化」することで、グループを辞書に変換します。

+0

ありがとうございました。私は自分の質問を更新しました。どうぞご覧ください。 – sidon

+0

@sidonあなたが見せてくれる2つのアプローチは、最終的にはとにかく辞書が得られるので、ほとんど同じです。ただし、辞書内のリストを2回以上列挙しないことが確実でない限り、AsEnumerable()をそこに残してはいけません。 – dasblinkenlight

+0

@sidonディクショナリオブジェクトの代わりにルックアップオブジェクトを使用できる場合、 'ToDictionary'をスキップすることができます。 – dasblinkenlight

3

次のようにまた、あなたの必要な結果を得ることができます。これはdasblinkenlightと同じ結果が得られますが、group by句にKeyValuePairのマッピングを移動

var result = source 
    .GroupBy(x => x.Value, x => x.Key) 
    .ToDictionary(g => g.Key, g => g.ToList()); 

関連する問題