C#将列表转换为字典
这似乎是一件很奇怪的事情,但是忽略了这一点,是否有一个简洁的方式将List转换为字典,其中Dictionary中的每个键值对都只是列表中的每个字符串。即C#将列表<string>转换为字典<string,string>
List = string1, string2, string3
Dictionary = string1/string1, string2/string2, string3/string3
我已经做了很多搜索的和你确实有很多的例子#2单独向相反的方向做,但不这样一轮。
这样做的原因是我有两个第三部分组件,并且改变它们不在我的手中。一个将列表中的电子邮件地址作为List返回,另一个发送To参数为Dictionary的电子邮件。字典的关键是电子邮件地址,价值是他们的真实姓名。但是,我不知道真名,但如果您将真实姓名也设置为电子邮件地址,它仍然有效。因此,我为什么要将List转换为字典。有很多方法可以做到这一点。列表中的foreach循环将kvp添加到字典中。但我喜欢简洁的代码,并想知道是否有单线解决方案。
试试这个:
var res = list.ToDictionary(x => x, x => x);
第一拉姆达让您挑选的关键,第二个采值。
你可以用它玩,使值从按键不同,像这样:
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")) ...
如果列表类似于string1,string2,string3,string1 – 2012-07-20 14:16:33
@PranayRana Yes , 它会。你可以在'list'后添加'.Distinct()'来避免这种情况。 – dasblinkenlight 2012-07-20 14:19:12
谢谢。我错过了ToDictionary功能。感谢大家基本上给出了相同的答案。我向每个人投了票,但只能接受一个答案。这是唯一一个添加了不同的代码,所以在我看来是最完整的。 – Jonnster 2012-07-20 15:29:04
使用此:
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>>
,所以你会有一个不同的密钥列表,每个字符串实例都在其下。
如果列表类似于string1,string2,string3,string1 – 2012-07-20 14:16:38
@PranayRana,那么这将失败:你是对的。修复。 – 2012-07-20 15:43:15
通过使用ToDictionary
:
var dictionary = list.ToDictionary(s => s);
如果它是可能的任何字符串可以重复,或者做一个Distinct
呼叫第一列表上(删除重复),或者使用ToLookup
其允许每多个值键。
编辑
另一种方式来处理重复的,你可以像这样
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);
但要确保没有串重复......再次otherewise上面的代码不会为你
工作,如果有串的重复比它更好地做到这样
Dictionary<string,string> dic= new Dictionary<string,string>();
foreach(string s in Stringlist)
{
if(!dic.ContainsKey(s))
{
// dic.Add(value to dictionary
}
}
您可以使用:
var dictionary = myList.ToDictionary(x => x);
我有一个更好的解决方案,为您的正当理由,诚实。 – Will 2012-07-20 14:15:38
您可能想查看HashSet 是否符合您的要求,而不是使用字典。 – Greg 2012-07-20 14:15:50
比上面的评论者更直接:如果你解释你想要这个的原因,有人可能会提出更好的解决方案。 – 2012-07-20 14:25:55