【问题标题】:LINQ - How to Group By with Dictionary <string, string[]>?LINQ - 如何使用字典 <string, string[]> 进行分组?
【发布时间】:2015-07-29 18:25:49
【问题描述】:

我有一本这样的字典:

Dictionary<string, string[]> dic = new Dictionary<string,string[]>(){
            {"A", new string [] {"1", "2", "$", "3", "4"}},
            {"B", new string [] {"5", "6", "$", "7", "8"}},
            {"C", new string [] {"9", "10", "@", "11", "12"}}
        };

我想把它变成一个像这样的新字典:

Dictionary<string, List<string[]>> res = new Dictionary<string,List<string[]>>{
            {"$", new List<string[]> { 
                new string [] {"1", "2", "A", "3", "4"}, 
                new string [] {"5", "6", "B", "7", "8"} 
                }
            },               
            {"@", new List<string[]> { 
                new string [] {"9", "10", "C", "11", "12"}
                }
            }
        };

所以新的Key成为旧字符串数组的第三个元素,旧的Key被添加到新的字符串数组中。

注意 - 旧 Key 不需要作为新数组的第三个元素放置,但它确实需要在每个新数组的相同索引中。

我开始尝试为此使用一些 LINQ,但无法理解整个事情 - 这个:

Dictionary<string, string[]> test = dic.GroupBy(x => x.Value[2])
.ToDictionary(s => s.Key, s => s.Select(x => x.Key).ToArray());

仅适用于创建另一个字符串键控数组值字典,其中键正确成为第三个元素,但值只是旧键。

【问题讨论】:

    标签: c# arrays linq dictionary


    【解决方案1】:

    一种可能的解决方案:

    Dictionary<string, string[]> dic = new Dictionary<string,string[]>(){
                {"A", new string [] {"1", "2", "$", "3", "4"}},
                {"B", new string [] {"5", "6", "$", "7", "8"}},
                {"C", new string [] {"9", "10", "@", "11", "12"}}
            };
    
    var res = dic.Select(p => new KeyValuePair<string, string[]>(
                                  p.Value[2], 
                                  p.Value.Select((v,i) => i == 2 ? p.Key : v).ToArray()))
                 .GroupBy(p => p.Key)
                 .ToDictionary(g => g.Key, g => g.Select(p => p.Value).ToList());
    

    【讨论】:

      【解决方案2】:
      var replacedIndex = 2;
      
      var newDictionary = 
          oldDictionary.GroupBy(x => x.Value.ElementAt(replacedIndex))
                       .ToDictionary(group => group.Key, group => group.Select(x =>
                       {
                           var collection = x.Value;
                           collection[replacedIndex] = x.Key;
                           return collection;
                       }));
      

      【讨论】:

      • 这不起作用,因为group.Key 是 $ 或 @ 而不是原来的键 A、B 和 C。
      • @juharr 啊,你是对的。请查看更新后的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 2020-02-02
      • 2019-01-28
      • 2022-07-12
      • 2017-09-24
      相关资源
      最近更新 更多