簡體   English   中英

字典值作為不同的鍵

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM