2012-07-20 263 views
58

这似乎是一件很奇怪的事情,但是忽略了这一点,是否有一个简洁的方式将List转换为字典,其中Dictionary中的每个键值对都只是列表中的每个字符串。即C#将列表<string>转换为字典<string,string>

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

我已经做了很多搜索的和你确实有很多的例子#2单独向相反的方向做,但不这样一轮。

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

+1

我有一个更好的解决方案,为您的正当理由,诚实。 – Will 2012-07-20 14:15:38

+2

您可能想查看HashSet <>是否符合您的要求,而不是使用字典<,>。 – Greg 2012-07-20 14:15:50

+0

比上面的评论者更直接:如果你解释你想要这个的原因,有人可能会提出更好的解决方案。 – 2012-07-20 14:25:55

回答

124

试试这个:

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

第一拉姆达让您挑选的关键,第二个采值。

你可以用它玩,使值从按键不同,像这样:

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

如果您的列表包含重复,加上Distinct()这样的:

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

编辑要发表评论根据正当的理由,我认为这样的转换可能有效的唯一原因是,在某些时候,结果字典中的键和值会发生分歧。例如,您将执行初始转换,然后用其他值替换一些值。如果键和值总是将是相同的,HashSet<String>将为您的情况更加适合:

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

如果列表类似于string1,string2,string3,string1 – 2012-07-20 14:16:33

+3

@PranayRana Yes , 它会。你可以在'list'后添加'.Distinct()'来避免这种情况。 – dasblinkenlight 2012-07-20 14:19:12

+0

谢谢。我错过了ToDictionary功能。感谢大家基本上给出了相同的答案。我向每个人投了票,但只能接受一个答案。这是唯一一个添加了不同的代码,所以在我看来是最完整的。 – Jonnster 2012-07-20 15:29:04

7

使用此:

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

更多信息,请参见MSDN

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

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

这将返回一个ILookup<string, string>这是基本相同IDictionary<string, IEnumerable<string>>,所以你会有一个不同的密钥列表,每个字符串实例都在其下。

+0

如果列表类似于string1,string2,string3,string1 – 2012-07-20 14:16:38

+0

@PranayRana,那么这将失败:你是对的。修复。 – 2012-07-20 15:43:15

1

通过使用ToDictionary

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

如果它是可能的任何字符串可以重复,或者做一个Distinct呼叫第一列表上(删除重复),或者使用ToLookup其允许每多个值键。

0

编辑

另一种方式来处理重复的,你可以像这样

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

但要确保没有串重复......再次otherewise上面的代码不会为你

工作,如果有串的重复比它更好地做到这样

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

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

您可以使用:

var dictionary = myList.ToDictionary(x => x); 
相关问题