C#将List <String>转换为Dictionary <string,string>

这似乎是一个奇怪的事情要做,但忽略,是否有一个很好的简洁的方式转换列表到字典,其中每个字典中的键值对只是列表中的每个string。 即

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

我已经做了大量的search,并且在Stackoverflow上只有几十个例子,但是却没有这样做。

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

尝试这个:

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

第一个lambda让你select键,第二个select的价值。

你可以玩它,并使值不同的键,如下所示:

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

如果你的列表包含重复,像这样添加Distinct()

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

编辑要评论有效的原因,我认为这样的转换可能有效的唯一原因是,在某些时候,在结果字典中的键和值将发生分歧。 例如,您将执行初始转换,然后用其他值replace一些值。 如果键和值总是相同的, 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> ,因此您将拥有一个不同的键的列表,其中每个string实例都包含在其中。

通过使用ToDictionary

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

如果有可能重复任何string,则可以先在列表上执行“ 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); 

但确保没有string正在重复…再上面的代码不会为你工作

如果有string比它更好地重复这样做

 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);