我想要分组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
这甚至可能吗?有人可以帮我吗?
感谢。
答案 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);
}