从值获取键 – Dictionary <string,List >
我通过指定值来获取密钥时遇到问题。 我能做到这一点的最佳方式是什么?
var st1= new List { "NY", "CT", "ME" }; var st2= new List { "KY", "TN", "SC" }; var st3= new List { "TX", "OK", "MO" }; var statesToEmailDictionary = new Dictionary<string, List>(); statesToEmailDictionary.Add("test1@gmail.com", st1); statesToEmailDictionary.Add("test2@gmail.com", st2); statesToEmailDictionary.Add("test3@gmail.com", st3); var emailAdd = statesToEmailDictionary.FirstOrDefault(x => x.Value.Where(y => y.Contains(state))).Key;
FirstOrDefault
的返回值是KeyValuePair
,因此要获取密钥,只需使用Key
属性即可。 像这样:
var emailAdd = statesToEmailDictionary .FirstOrDefault(x => x.Value.Contains(state)) .Key;
或者,这是查询语法中的等价物:
var emailAdd = (from p in statesToEmailDictionary where p.Value.Contains(state) select p.Key) .FirstOrDefault();
我想你想要:
var emailAdd = statesToEmailDictionary.FirstOrDefault(x => x.Value.Any(y => y.Contains(state))).Key;
var emailAdd = statesToEmailDictionary .FirstOrDefault(x => x.Value != null && x.Value.Contains(state)) .Key;
但是如果你正在寻找性能,我建议你翻一下你的字典并创建一个
字典来做你正在寻找的东西。
// To handle when it's not in the results string emailAdd2 = null; foreach (var kvp in statesToEmailDictionary) { if (kvp.Value != null && kvp.Value.Contains(state)) { emailAdd2 = kvp.Key; break; } }
这个post中没有人提到的是FirstOrDefault
方法只能通过Linq获得 :
using System; using System.Collections.Generic; // FirstOrDefault is part of the Linq API using System.Linq; namespace Foo { class Program { static void main (string [] args) { var d = new Dictionary () { { "one", "first" }, { "two", "second" }, { "three", "third" } }; Console.WriteLine (d.FirstOrDefault (x => x.Value == "second").Key); } } }
var emailAdd = statesToEmailDictionary.First(x=>x.Value.Contains(state)).Key;
简单的Linq就是这么做的
Dim mKP = (From mType As KeyValuePair(Of , ) In Where mType.Value = Select mType).ToList If mKP.Count > 0 then Dim value as = mKP.First.Value Dim key as = mKP.First.Key End if
当然,如果存在重复值,则返回多个KeyValuePair
var temp = statesToEmailDictionary.Where( x => x.Value.Contains(state)).FirstOrDefault(); var emailAdd = temp != null ? temp.Key : string.Empty;