C # 转换 List < string > 到 Dictionary < string,string >

这似乎是一件奇怪的事情,但忽略这一点,有一个很好的简洁的方法来转换 List<string>Dictionary<string, string>,其中每个关键值对在字典中只是列表中的每个字符串。也就是说。

List = string1, string2, string3
Dictionary = string1/string1, string2/string2, string3/string3

我已经做了大量的搜索,并且在 Stackoverflow 上有几十个单独的例子,这些例子都是在相反的方向上进行的,而不是这种方向。

这样做的原因是,我有两个第三部分的组成部分和改变他们是我的手。其中一个返回电子邮件地址列表 List<string>,另一个发送电子邮件,其中 To 参数为 Dictionary<string, string>。字典的键是电子邮件地址,值是他们的真实姓名。然而,我不知道真实姓名,但它仍然工作,如果你设置的真实姓名的电子邮件地址以及。因此,我为什么要将 List 转换为 Dictionary<string, string>。有很多方法可以做到这一点。列表上的 foreach循环,它将 kvp 添加到字典中。但是我喜欢简洁的代码,并且想知道是否有一个单行的解决方案。

271878 次浏览

试试这个:

var res = list.ToDictionary(x => x, x => x);

第一个 lambda 允许您选择键,第二个 lambda 选择值。

您可以使用它,并使值不同于键,如下所示:

var res = list.ToDictionary(x => x, x => string.Format("Val: {0}", x));

如果您的列表包含重复的内容,请像下面这样添加 Distinct():

var res = list.Distinct().ToDictionary(x => x, x => x);

EDIT 为了解释有效的原因,我认为对于这样的转换可能有效的唯一原因是,在某个时候,结果字典中的键和值将会发生分歧。例如,可以进行初始转换,然后用其他值替换一些值。如果键和值是 一直都是将是相同的,HashSet<String>将提供一个更好的适合您的情况:

var res = new HashSet<string>(list);
if (res.Contains("string1")) ...

用这个:

var dict = list.ToDictionary(x => x);

有关更多信息,请参见 MSDN

Pranay 在评论中指出,如果一个项目在列表中存在多次,这将失败。
根据您的具体要求,您可以使用 var dict = list.Distinct().ToDictionary(x => x);来获得不同项目的字典,或者您可以使用 ToLookup代替:

var dict = list.ToLookup(x => x);

这将返回一个与 IDictionary<string, IEnumerable<string>>基本相同的 ILookup<string, string>,因此您将拥有一个包含每个字符串实例的不同键列表。

使用 ToDictionary:

var dictionary = list.ToDictionary(s => s);

如果有可能重复任何字符串,要么首先在列表中执行 Distinct调用(以删除重复项) ,要么使用允许每个键有多个值的 ToLookup

剪辑

另一种处理重复的方法是你可以这样做

var dic = slist.Select((element, index)=> new{element,index} )
.ToDictionary(ele=>ele.index.ToString(), ele=>ele.element);

或者


最简单的方法就是

var res = list.ToDictionary(str => str, str=> str);

但是要确保没有字符串重复... ... 否则上面的代码也不会为您工作

如果有字符串是重复的比它更好的做法是这样

Dictionary<string,string> dic= new Dictionary<string,string> ();


foreach(string s in Stringlist)
{
if(!dic.ContainsKey(s))
{
//  dic.Add( value to dictionary
}
}

你可使用:

var dictionary = myList.ToDictionary(x => x);