2013-07-18 17 views
2

想知道是否有可能在單個LINQ語句中反轉字典?c#反轉和使用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 
    }; 

回答

1

可以使用SelectMany分裂值子列表,然後反向鍵&值到使用ToDictionary

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

如果你這樣做:

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

那麼你得到:

1 - S

2 - S

3 - S

4 - 米

5 - 米

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

對於您可以使用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)));