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


117

这似乎是一件很奇怪的事情,但是忽略了这一点,是否有一种将List转换为Dictionary的简洁方法,其中Dictionary中的每个键值对都只是List中的每个字符串。即

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

我已经做了很多搜索,而实际上在Stackoverflow上有数十个示例,它们以相反的方向进行操作,但并非以这种方式进行。

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


1
老实说,出于您的正当理由,我有更好的解决方案。

2
您可能想查看HashSet <>是否满足您的要求,而不是使用Dictionary <,>。
格雷格2012年

比上面的评论者更直接:如果您解释您想要这样做的原因,那么有人可能会提出更好的解决方案。
Tim S.

1
没有更好的解决方案。我有一个第三方组件,该组件返回一个字符串列表,这些字符串是电子邮件地址。我还有另一个第三方组件,该组件在通过Dictionary <string,string>的情况下发送电子邮件,其中的键是电子邮件地址,值是收件人的真实姓名。但是,真实姓名也可以再次成为电子邮件地址,这就是为什么我要将List <string>转换为Dictionary <string,string>的原因
Jonnster 2012年

Answers:


243

试试这个:

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

编辑要评论有效的原因,我认为可能对此类转换有效的唯一原因是,在某些时候,键值和结果字典中的值将有所不同。例如,您将进行初始转换,然后将某些值替换为其他值。如果键和值始终是相同的,HashSet<String>则将更好地适合您的情况:

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

如果列表类似于string1,string2,
string3

3
@PranayRana是的,会的。您可以在.Distinct()之后添加list以避免这种情况。
dasblinkenlight 2012年

谢谢。我错过了ToDictionary函数。感谢基本上给出相同答案的每个人。我投票给所有人,但只能接受一个答案。这只是添加了Distinct代码的代码,因此我认为是最完整的代码。
约恩斯特2012年

11

用这个:

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>>,因此您将拥有一个不同键的列表,其中包含每个字符串实例。


如果列表类似于string1,string2,
string3

1

通过使用ToDictionary

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

如果可能重复任何字符串,Distinct请先在列表上进行调用(以删除重复项),或者使用ToLookup允许每个键使用多个值的调用。


0

您可以使用:

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

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

但是请确保没有重复的字符串...否则,以上代码对您不起作用

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

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

    foreach(string s in Stringlist)
    {
       if(!dic.ContainsKey(s))
       {
        //  dic.Add( value to dictionary
      }
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.