C# Convert List<string> to Dictionary<string, string>
这似乎是一件很奇怪的事情,但忽略了这一点,是否有一种很好的简洁的方法将列表转换为字典,其中字典中的每个键值对只是列表中的每个字符串。即
1 2 | List = string1, string2, string3 Dictionary = string1/string1, string2/string2, string3/string3 |
我做了大量的搜索,在stackoverflow上有很多例子,只是在相反的方向上做,但不是这样。
这样做的原因是我有两个第三部分的组件,更换它们是我无法控制的。一个返回电子邮件地址列表作为列表,另一个发送电子邮件,其中to参数是字典。字典的键是电子邮件地址,值是它们的真实名称。但是,我不知道真名,但是如果您将真名设置为电子邮件地址,它仍然有效。因此,我为什么要将列表转换为字典。有很多方法可以做到这一点。列表上的foreach循环,将kvp添加到字典中。但我喜欢简明扼要的代码,并想知道是否有单行解决方案。
试试这个:
1 | var res = list.ToDictionary(x => x, x => x); |
第一个lambda允许您选择键,第二个lambda允许您选择值。
您可以使用它并使值与键不同,如下所示:
1 | var res = list.ToDictionary(x => x, x => string.Format("Val: {0}", x)); |
号
如果您的列表中包含重复项,请按如下方式添加
1 | var res = list.Distinct().ToDictionary(x => x, x => x); |
编辑来评论有效的原因,我认为唯一能对这样的转换有效的原因是,在某个时刻,结果字典中的键和值会出现分歧。例如,您将进行初始转换,然后用其他内容替换一些值。如果键和值总是相同的,
1 2 |
。
使用此:
1 | var dict = list.ToDictionary(x => x); |
有关详细信息,请参阅msdn。
正如Pranay在评论中指出的那样,如果列表中有一个项目多次出现,这将失败。根据您的具体要求,您可以使用
1 | var dict = list.ToLookup(x => x); |
。
这将返回一个
使用
1 | var dictionary = list.ToDictionary(s => s); |
。
如果有可能重复任何字符串,可以先在列表上执行
您可以使用:
1 | var dictionary = myList.ToDictionary(x => x); |
。
编辑
另一种处理重复的方法是这样做
1 2 | var dic = slist.Select((element, index)=> new{element,index} ) .ToDictionary(ele=>ele.index.ToString(), ele=>ele.element); |
或
简单的方法是
1 | var res = list.ToDictionary(str => str, str=> str); |
。
但请确保没有字符串重复…否则上面的代码对您不起作用。
如果有字符串重复,最好这样做
1 2 3 4 5 6 7 8 9 | Dictionary<string,string> dic= new Dictionary<string,string> (); foreach(string s in Stringlist) { if(!dic.ContainsKey(s)) { // dic.Add( value to dictionary } } |