C#转换列表< string>

C# Convert List<string> to Dictionary<string, string>

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

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

我做了大量的搜索,在stackoverflow上有很多例子,只是在相反的方向上做,但不是这样。

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


试试这个:

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

第一个lambda允许您选择键,第二个lambda允许您选择值。

您可以使用它并使值与键不同,如下所示:

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

如果您的列表中包含重复项,请按如下方式添加Distinct()

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

编辑来评论有效的原因,我认为唯一能对这样的转换有效的原因是,在某个时刻,结果字典中的键和值会出现分歧。例如,您将进行初始转换,然后用其他内容替换一些值。如果键和值总是相同的,HashSet将为您的情况提供更好的适应:

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


使用此:

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

有关详细信息,请参阅msdn。

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

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

这将返回一个ILookup,本质上与IDictionary>相同,因此您将拥有一个不同键的列表,其中每个字符串实例都位于该列表之下。


使用ToDictionary

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

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


您可以使用:

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


编辑

另一种处理重复的方法是这样做

1
2
var dic = slist.Select((element, index)=> new{element,index} )
            .ToDictionary(ele=>ele.index.ToString(), ele=>ele.element);

简单的方法是

1
var res = list.ToDictionary(str => str, str=> str);

但请确保没有字符串重复…否则上面的代码对您不起作用。

如果有字符串重复,最好这样做

1
2
3
4
5
6
7
8
9
Dictionary<string,string> dic= new Dictionary<string,string> ();

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