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

Jon*_*ter 108 c# dictionary list

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

List = string1, string2, string3
Dictionary = string1/string1, string2/string2, string3/string3
Run Code Online (Sandbox Code Playgroud)

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

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

das*_*ght 218

试试这个:

var res = list.ToDictionary(x => x, x => x);
Run Code Online (Sandbox Code Playgroud)

第一个lambda允许你选择键,第二个lambda选择值.

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

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

如果您的列表包含重复项,请添加Distinct()如下:

var res = list.Distinct().ToDictionary(x => x, x => x);
Run Code Online (Sandbox Code Playgroud)

编辑为了评论有效的原因,我认为对于这样的转换可能有效的唯一原因是,在某些时候,结果字典中的键和值将会发生分歧.例如,您将进行初始转换,然后使用其他值替换某些值.如果键和值始终相同,则HashSet<String>可以更好地适应您的情况:

var res = new HashSet<string>(list);
if (res.Contains("string1")) ...
Run Code Online (Sandbox Code Playgroud)

  • @PranayRana是的,它会的.您可以在`list`之后添加`.Distinct()`来避免这种情况. (3认同)

Pra*_*ana 13

编辑

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

var dic = slist.Select((element, index)=> new{element,index} )
            .ToDictionary(ele=>ele.index.ToString(), ele=>ele.element);
Run Code Online (Sandbox Code Playgroud)

或者


简单的方法是

var res = list.ToDictionary(str => str, str=> str); 
Run Code Online (Sandbox Code Playgroud)

但请确保没有字符串重复...否则上面的代码将无法为您工作

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

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

    foreach(string s in Stringlist)
    {
       if(!dic.ContainsKey(s))
       {
        //  dic.Add( value to dictionary
      }
    }
Run Code Online (Sandbox Code Playgroud)


Dan*_*rth 10

用这个:

var dict = list.ToDictionary(x => x);
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅MSDN.

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

var dict = list.ToLookup(x => x);
Run Code Online (Sandbox Code Playgroud)

这将返回一个ILookup<string, string>基本相同的IDictionary<string, IEnumerable<string>>,因此您将拥有一个不同键的列表,其中包含每个字符串实例.