次のように、文字列から小数へのキーのコレクションがあるとします。
{ "Alfred", [1, 2] }
{ "Batman", [1, 2, 3] }
この関係をC#で簡単に反転して、コレクションがある場所にするにはどうすればよいですか:
{ 1, ["Alfred", "Batman"] }
{ 2, ["Alfred", "Batman"] }
{ 3, ["Batman" ] }
次のように、文字列から小数へのキーのコレクションがあるとします。
{ "Alfred", [1, 2] }
{ "Batman", [1, 2, 3] }
この関係をC#で簡単に反転して、コレクションがある場所にするにはどうすればよいですか:
{ 1, ["Alfred", "Batman"] }
{ 2, ["Alfred", "Batman"] }
{ 3, ["Batman" ] }
LINQを使用できます。
var d = new Dictionary<string,int[]>{
{"Alfred", new[] {1,2}}
, {"Batman", new[] {1,2,3}}
};
var res = d
.SelectMany(p=>p.Value.Select(v => new {p.Key, Value = v}))
.GroupBy(p => p.Value)
.ToDictionary(g => g.Key, g => g.Select(v => v.Key).ToArray());
foreach (var p in res)
Console.WriteLine("{0} = ({1})", p.Key, string.Join(", ", p.Value));
このコードは次の出力を生成します(ideone link):
1 = (Alfred, Batman)
2 = (Alfred, Batman)
3 = (Batman)
g => g.Key
との違いに注意してくださいg => g.Select(v => v.Key)
。前者はグループのキーを選択し、後者は元の辞書のキーを選択します。