字典值作为不同的键

时间:2017-11-30 15:04:39

标签: c# string list dictionary

我有这个:

        var color = new Dictionary<string, List<string>>();
        color.Add("Blue", new List<string>() { "1", "2" });
        color.Add("Green", new List<string>() { "2", "3" });
        color.Add("Red", new List<string>() { "1", "3" });
        color.Add("Black", new List<string>() { "3" });
        color.Add("Yellow", new List<string>() { "1" });

我想将其转换为

Dictionary<string, List<string>>

看起来像这样:

Key: 1, Value: Blue, Red, Yellow
Key: 2, Value: Blue, Green
Key: 3, Value: Green, Red, Black

尝试:

var test = color.GroupBy(x => x.Value.FirstOrDefault())
.ToDictionary(g => g.Key, g => g.Select(x => x.Key).ToList());

然而,这仅适用于一个项目(“FirstOrDefault()”),我只能

Key: 1, Value: Blue, Red, Yellow

我怎么能这样做? 我可以循环遍历值(不同)并循环遍历键并检查值是否存在然后构建一个新的但我想避免这种情况并使用lamda。

看过很多这样的例子,但没有字符串列表作为值,只有一个字符串。

3 个答案:

答案 0 :(得分:6)

试试这个:

var test = color
    .SelectMany(x => x.Value.Select(v =>
    new
    {
       Color = x.Key,
       Integer = v
    }))
    .GroupBy(x => x.Integer)
    .ToDictionary(x => x.Key, x => x.Select(y => y.Color).ToList());

答案 1 :(得分:3)

基本上,我和@SamIAm和@ kanders84152有同样的想法。我只想做一点改进并添加一个解释:

var test = color
    .SelectMany(c => c.Value.Select(v => new { Number = v, Color = c.Key }))
    .GroupBy(a => a.Number, a => a.Color)
    .ToDictionary(g => g.Key, g => g.ToList());

我的解决方案的主要区别在于GroupBy部分从匿名类型而不是ToDictionary部分中提取颜色。

首先,.SelectMany(c => c.Value.Select(v => new { Number = v, Color = c.Key }))部分将嵌套列表展平为具有数字和颜色名称的匿名类型的枚举。

原始字典条目

"Blue", { "1", "2" }
"Green", { "2", "3" }
"Red", { "1", "3" }
"Black", { "3" }
"Yellow", { "1" }

成为

{ Number: "1", Color: "Blue" }
{ Number: "2", Color: "Blue" }
{ Number: "2", Color: "Green" }
{ Number: "3", Color: "Green" }
{ Number: "1", Color: "Red" }
{ Number: "3", Color: "Red" }
{ Number: "3", Color: "Black" }
{ Number: "1", Color: "Yellow" }
然后

.GroupBy(a => a.Number, a => a.Color)将这些值重新分组,并将颜色作为值

"1", { "Blue", "Red", "Yellow" }
"2", { "Blue", "Green" }
"3", { "Green" "Red", "Black" }

这几乎是理想的结果,除了我们有一个IGrouping<string, string>(其中组代表一个键和一个值的枚举)  而不是Dictionary<string, List<string>>。最后.ToDictionary(g => g.Key, g => g.ToList())创建了具有相同结构的所需字典。

答案 2 :(得分:0)

如果我是你,我先把它压扁

var colorflat = color
    .SelectMany(c => c.Value.Select(n => new {Color=c.Key, Number=n}));

然后我将分组到新格式

var test = colorflat
    .GroupBy(c => c.Number)
    .ToDictionary(c => c.Key, c => c.Select(x => x.Color).ToList());