我有一个dictionary<string,string>
,其中包含以下值
"abc","Message 1"
"def","Message 1"
"ghi","Message 2"
"jkl","Message 1"
"mno","Message 2"
"pqr","Message 3"
最终,我试图通过消息对这个词典进行分组。
我想要做的是遍历这个新词典,并能够输出这样的内容:
abc, def, jkl : Message 1
ghi, mno : Message 2
prq : Message 3
我正在尝试构建另一个对象,以便我可以遍历它,但ToDictionary()
给了我一些问题:
var oD = messageDictionary.GroupBy(x => x.Value).ToDictionary(g=>g.Key,g=>g.ToString());
此示例中的问题是值部分为NULL
时。因为ToDictionary
会引发NullReferenceException
。我该如何解决?
我还试过创建一个像这样的新词典:
Dictionary<string, string> newDictionary = new Dictionary<string, string>();
newDictionary = messageDictionary.GroupBy(x => x.Value);
这有转换问题。
也许有更好的方法然后使用字典?我只是觉得使用字典会更容易。任何建议都会有所帮助。
答案 0 :(得分:2)
我会坚持到字典,因为你几乎在那里,这将帮助你理解你错过了什么。
问题出在Value
的{{1}} - 您想要选择所有dictionary
(原始字典的键)并将item.Key
作为值你的新词典。
然后,您可以使用IEnumerable
string.Join
输出:
答案 1 :(得分:2)
您可以使用以下代码
Dictionary<string, string> myDict = new Dictionary<string, string>(){
{ "abc","Message 1" },
{"def","Message 1" },
{"ghi","Message 2"} ,
{"jkl","Message 1"} ,
{"mno","Message 2"} ,
{"pqr","Message 3"}
};
var temp = myDict.GroupBy(c => c.Value);
foreach (var i in temp)
{
Console.WriteLine(i.Key);
foreach (var k in i)
{
Console.WriteLine("{0}", k.Key);
}
Console.WriteLine("=============");
}
答案 2 :(得分:1)
您可以使用Aggregate方法将密钥附加在一起,如下所示:
var oD = messageDictionary.GroupBy(x => x.Value).ToDictionary(g => g.Key, g => g.Select(v => v.Value).Aggregate((a, c) => a + ',' + c))
答案 3 :(得分:1)
创建一个multimap(“value”是一个集合的字典)正是ToLookup扩展的工作。
它也很好地处理空键(添加了一个示例并稍微改变了格式以反映)。
var values = new Dictionary<string, string> {
{ "abc", "Message 1" },
{ "def", "Message 1" },
{ "ghi", "Message 2" },
{ "jkl", "Message 1" },
{ "mno", "Message 2" },
{ "pqr", "Message 3" }
{ "stu", null },
};
// we create a lookup where the key is the value and it's values are the keys
var valueLookup = values.ToLookup (kvp => kvp.Value, kvp => kvp.Key);
foreach (var valueGroup in valueLookup)
{
// valueGroup has type IGrouping<string, string>
// which implements IEnumerable<string>
// it allows it to be used by string.Join directly
Console.WriteLine ($"{string.Join (", ", valueGroup)}: [{valueGroup.Key}]");
}
输出:
abc,def,jkl:[留言1]
ghi,mno:[留言2]
pqr:[留言3]
stu:[]