从值获取键 – 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;