C#将List <string>转换为Dictionary <string,string =“”> </string,> </string>

时间:2012-07-20 14:11:06

标签: c# list dictionary

这可能看起来很奇怪,但忽略了这一点,是否有一种将List转换为Dictionary的简洁方法,其中Dictionary中的每个键值对只是List中的每个字符串。即。

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

我已经进行了大量的搜索,并且在Stackoverflow上实际上有几十个例子在相反的方向上进行,但不是这样。

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

5 个答案:

答案 0 :(得分:190)

试试这个:

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")) ...

答案 1 :(得分:10)

使用此:

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

答案 2 :(得分:1)

使用ToDictionary

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

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

答案 3 :(得分: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
      }
    }

答案 4 :(得分:0)

您可以使用:

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