如何在Dictionary中切换Key和Values,其值可能为Null

时间:2016-08-04 19:17:34

标签: c# linq dictionary

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

这有转换问题。

也许有更好的方法然后使用字典?我只是觉得使用字典会更容易。任何建议都会有所帮助。

4 个答案:

答案 0 :(得分:2)

我会坚持到字典,因为你几乎在那里,这将帮助你理解你错过了什么。

问题出在Value的{​​{1}} - 您想要选择所有dictionary(原始字典的键)并将item.Key作为值你的新词典。

然后,您可以使用IEnumerable

打印加入新的“值”
string.Join

输出:

enter image description here

答案 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("=============");

            }

输出: enter image description here

答案 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:[]