繁体   English   中英

C# 转换列表<string>词典<string, string></string,></string>

[英]C# Convert List<string> to Dictionary<string, string>

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

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

我做了很多搜索,仅在 Stackoverflow 上就有几十个相反方向的例子,但不是这样。

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

试试这个:

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

第一个 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")) ...

用这个:

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>>基本相同,因此您将拥有一个不同键的列表,每个字符串实例都在它下面。

编辑

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

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
      }
    }

通过使用ToDictionary

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

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

您可以使用:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM