c#使用linq反转和序列化词典

c#使用linq反转和序列化词典,c#,linq,C#,Linq,想知道是否可以在一个LINQ语句中反转字典 结构如下: Dictionary<string, List<string>> original = new Dictionary<string, List<string>>() { {"s", new List<string>() { "1", "2", "3" }}, {"m", new List<string>() { "4", "5"

想知道是否可以在一个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 original=new Dictionary()
{
{“s”,新列表(){“1”,“2”,“3”},
{“m”,新列表(){“4”、“5”、“6”},
{“l”,新列表(){“7”,“8”,“9”},
{“xl”,新列表(){“10”、“11”、“12”},
};
我想把它转换成一本类型的字典

Dictionary<string, string> Reverse = new Dictionary<string, string>()
    {
        {"1", "s"},
        {"2", "s"}, //and so on
    };
Dictionary Reverse=new Dictionary()
{
{“1”,“s”},
{“2”、“s”}、//等等
};
如果您这样做:

var reversed = original.SelectMany(x => x.Value.Select(y => new KeyValuePair<string, string>(y, x.Key)));
var reversed=original.SelectMany(x=>x.Value.Select(y=>newkeyvaluepair(y,x.Key));
然后你会得到:

1-s

2-s

3-s

4米

5米

等等。

类似于:

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);

为此,您可以使用
SelectMany
LINQ扩展方法:

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)));
var original=新字典
{
{“s”,新列表{“1”、“2”、“3”},
{“m”,新列表{“4”、“5”、“6”},
{“l”,新列表{“7”、“8”、“9”},
{“xl”,新名单{“10”、“11”、“12”},
};
var keyValuePairs=original.SelectMany(o=>o.Value.Select(v=>newkeyvaluepair(v,o.Key));

您可以使用
SelectMany
拆分值子列表,然后使用
ToDictionary将键和值反转到新词典中

var result = original
    .SelectMany(k=> k.Value.Select(v => new { Key = v, Value = k.Key } ))
    .ToDictionary( t=> t.Key, t=> t.Value);