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)
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>>
,因此您将拥有一个不同键的列表,其中包含每个字符串实例.