6

我有一个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

这甚至可能吗?任何人都可以帮助我吗?

谢谢。

4

3 回答 3

9

好吧,你可以使用:

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

group 部分将为您提供一个IGrouping<string, KeyValuePair<string, string>>,随后ToDictionary将每组键/值对转换回字典。

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

于 2012-05-09T13:13:49.383 回答
0
yourDictionary
    .GroupBy(g => g.Key.Substring(0, 1))
    .ToDictionary(k => k.Key, v => v.ToDictionary(k1 => k1.Key, v1 => v1.Value));
于 2012-05-09T13:12:40.433 回答
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);

        }
于 2012-05-09T13:19:27.780 回答