2

単一の LINQ ステートメントで辞書を逆にすることは可能でしょうか?

構造は次のとおりです。

Dictionary<string, List<string>> original = new Dictionary<string, List<string>>() 
    {
        {"s", new List<string>() { "1", "2", "3" }},
        {"m", new List<string>() { "4", "5", "6" }},
        {"l", new List<string>() { "7", "8", "9" }},
        {"xl", new List<string>() { "10", "11", "12" }},
    };

タイプの辞書に変換したい;

Dictionary<string, string> Reverse = new Dictionary<string, string>()
    {
        {"1", "s"},
        {"2", "s"}, //and so on
    };
4

4 に答える 4

2

もしあなたがそうするなら:

var reversed = original.SelectMany(x => x.Value.Select(y => new KeyValuePair<string, string>(y, x.Key)));

次に、次のようになります。

1 - 秒

2 - 秒

3 - 秒

4 - メートル

5 - メートル

于 2013-07-18T08:54:13.837 に答える
2

何かのようなもの:

var result = (from kvp in original
              from value in kvp.Value
              select new {Key = value, Value = kvp.Key}).ToDictionary(a => a.Key, a => a.Value);

または、メソッドの構文を好む場合は、次のようにします。

var result = original.SelectMany(kvp => kvp.Value.Select(v => new {Key = v, Value = kvp.Key}))
                     .ToDictionary(a => a.Key, a => a.Value);
于 2013-07-18T08:54:24.887 に答える
1

a を使用しSelectManyて値のサブリストを分割し、キーと値を逆にして新しい辞書にすることができますToDictionary

var result = original
    .SelectMany(k=> k.Value.Select(v => new { Key = v, Value = k.Key } ))
    .ToDictionary( t=> t.Key, t=> t.Value);
于 2013-07-18T08:58:51.203 に答える
1

そのために、SelectManyLINQ 拡張メソッドを使用できます。

var original = new Dictionary<string, List<string>>
                   {
                       { "s", new List<string> { "1", "2", "3" } },
                       { "m", new List<string> { "4", "5", "6" } },
                       { "l", new List<string> { "7", "8", "9" } },
                       { "xl", new List<string> { "10", "11", "12" } },
                   };

var keyValuePairs = original.SelectMany(o => o.Value.Select(v => new KeyValuePair<string, string>(v, o.Key)));
于 2013-07-18T08:58:03.683 に答える