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

Posted

技术标签:

【中文标题】C# 将 List<string> 转换为 Dictionary<string, string>【英文标题】:C# Convert List<string> to Dictionary<string, string> 【发布时间】:2012-07-19 20:00:23 【问题描述】:

这似乎是一件奇怪的事情,但忽略了这一点,是否有一种简洁的方式将List&lt;string&gt; 转换为Dictionary&lt;string, string&gt;,其中字典中的每个键值对只是列表中的每个字符串。即

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

我已经进行了大量搜索,仅在 *** 上就有几十个示例,它们是在相反的方向上做的,但不是这样。

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

【问题讨论】:

我有一个更好的解决方案,因为你的正当理由,老实说。 您可能想查看 HashSet 是否满足您的要求,而不是使用 Dictionary。 比上面的评论更直接:如果你解释你想要这个的原因,有人可能会提出更好的解决方案。 没有更好的解决方案。我有一个第三方组件,它返回一个字符串列表,这些是电子邮件地址。我有另一个第三方组件发送电子邮件,它通过 Dictionary 键是电子邮件地址,值是收件人的真实姓名。但是,真实姓名也可以只是电子邮件地址,这就是我想将 List 转换为 Dictionary 的原因 【参考方案1】:

试试这个:

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&lt;String&gt; 会更适合您的情况:

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

【讨论】:

如果列表类似于 string1, string2, string3,string1,这将失败 @PranayRana 是的,它会的。您可以在list 之后添加.Distinct() 以避免这种情况。 谢谢。我错过了 ToDictionary 功能。感谢基本上给出相同答案的每个人。我赞成所有人,但只能接受一个答案。这只是一个添加了 Distinct 代码的一个,所以在我看来是最完整的。【参考方案2】:

使用这个:

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

请参阅MSDN 了解更多信息。

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

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

这将返回一个ILookup&lt;string, string&gt;,它与IDictionary&lt;string, IEnumerable&lt;string&gt;&gt; 基本相同,因此您将拥有一个不同键的列表,其中包含每个字符串实例。

【讨论】:

如果列表类似于 string1, string2, string3,string1,这将失败【参考方案3】:

通过使用ToDictionary

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

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

【讨论】:

【参考方案4】:

编辑

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

var dic = slist.Select((element, index)=> newelement,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
      
    

【讨论】:

【参考方案5】:

你可以使用:

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

【讨论】:

以上是关于C# 将 List<string> 转换为 Dictionary<string, string>的主要内容,如果未能解决你的问题,请参考以下文章

c# List<int[]> 如何转成 string?

转C# Linq 交集并集差集去重

C#中List和数组之间转换的方法

C#中List<List<string>>要怎么处理?

C# 将 List<string> 添加到 List<List<string>> 数组

[转]C#压缩打包文件