GroupBy基于键的字典

时间:2012-05-09 13:10:03

标签: c# group-by

我想要分组Dictionary<string,string>。以下是一些示例键/值对

==========================
| Key            | Value |
==========================
| A_FirstValue   | 1     |
| A_SecondValue  | 2     |
| B_FirstValue   | 1     |
| B_SecondValue  | 2     |
==========================

现在,我想根据字符'_'

的第一个实例之前的键中的第一个字母或单词对其进行分组

因此,最终结果将为Dictionary<string, Dictionary<string, string>>。对于上面的示例,结果将是:

A -> A_FirstValue, 1
     A_SecondValue, 2

B -> B_FirstValue, 1
     B_SecondValue, 2

这甚至可能吗?有人可以帮我吗?

感谢。

3 个答案:

答案 0 :(得分:9)

好吧,你可以使用:

var dictionary = dictionary.GroupBy(pair => pair.Key.Substring(0, 1))
       .ToDictionary(group => group.Key,
                     group => group.ToDictionary(pair => pair.Key,
                                                 pair => pair.Value));

小组部分会为您提供IGrouping<string, KeyValuePair<string, string>>,后续的ToDictionary会将每组键/值对转换回字典。

编辑:请注意,这将始终使用第一个字母。对于任何更复杂的事情,我可能会编写一个单独的ExtractFirstWord(string)方法并在GroupBy lambda表达式中调用它。

答案 1 :(得分:0)

yourDictionary
    .GroupBy(g => g.Key.Substring(0, 1))
    .ToDictionary(k => k.Key, v => v.ToDictionary(k1 => k1.Key, v1 => v1.Value));

答案 2 :(得分:0)

这是我想出的。应该有一些错误处理,以确保密钥中存在_,但应该让你开始。

        var source = new Dictionary<string, int>();

        source.Add("A_FirstValue", 1);
        source.Add("A_SecondValue", 2);
        source.Add("B_FirstValue", 1);
        source.Add("B_SecondValue", 3);

        var dest = new Dictionary<string, Dictionary<string, int>>();

        foreach (KeyValuePair<string, int> entry in source) {
            string prefix = entry.Key.Split('_')[0];
            if (!dest.ContainsKey(prefix)) {
                dest.Add(prefix, new Dictionary<string, int>());
            }

            dest[prefix].Add(entry.Key, entry.Value);

        }