2016-11-07 4 views
2

У меня есть Dictionary<Guid,IList<string>>, который показывает все имена, которые может иметь сущность.Включение словаря <Guid, IList <String>> в словарь <string, IList <Guid>> С LINQ?

Я хочу преобразовать это, чтобы увидеть все имена, сопоставленные всем объектам. так:

[["FFF" => "a", "b"], 
["EEE" => "a", "c"]] 

Становится

[["a" => "FFF", "EEE"], 
["b" => "FFF"], 
["c" => "EEE"]] 

Я знаю, что это легко сделать с помощью foreaches, но мне интересно, если есть способ, с LINQ/ToDictionary?

ответ

5
private static void Main(string[] args) 
{ 
    var source = new Dictionary<Guid, IList<string>> 
    { 
     { Guid.NewGuid(), new List<string> { "a", "b" } }, 
     { Guid.NewGuid(), new List<string> { "b", "c" } }, 
    }; 

    var result = source 
     .SelectMany(x => x.Value, (x, y) => new { Key = y, Value = x.Key }) 
     .GroupBy(x => x.Key) 
     .ToDictionary(x => x.Key, x => x.Select(y => y.Value).ToList()); 

    foreach (var item in result) 
    { 
     Console.WriteLine($"Key: {item.Key}, Values: {string.Join(", ", item.Value)}"); 
    } 
} 
2
var dic = new Dictionary<string, List<string>>() 
{ 
    {"FFF", new List<string>(){"a", "b"}}, 
    {"EEE", new List<string>(){"a", "c"}} 
}; 

var res = dic.SelectMany(x => x.Value, (x,y) => new{Key = y, Value = x.Key}) 
      .ToLookup(x => x.Key, x => x.Value); 
0
Dictionary<int,IList<string>> d = new Dictionary<int ,IList<string>>(){ 
{1,new string[]{"a","b"}}, 
{2,new string[]{"a","d"}}, 
{3,new string[]{"b","c"}}, 
{4,new string[]{"x","y"}}}; 

d.SelectMany(kvp => kvp.Value.Select(element => new { kvp.Key, element})) 
.GroupBy(g => g.element, g => g.Key) 
.ToDictionary(g => g.Key, g => g.ToList()); 
Смежные вопросы