[英]Dictionary Values as distinct Keys
我有這個:
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。
看到了很多這樣的示例,但是沒有字符串列表作為值,而只有一個字符串。
嘗試這個:
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());
基本上,我和@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())
創建具有相同結構的所需字典。
如果我是你,我會先弄平
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());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.