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