我有一个字典列表,我正在搜索基于值的密钥。这该怎么做?
"someId"
会返回错误:
"字典中没有给定的密钥。"
因此,如果我给出价值" Ann",那么我希望该函数能够返回键#34; 30"。
字典中的每个项目都是这样的
item 1
[0] {[someid,30]}
[1] {[somename,"Ann"]}
[2] {[someaddress,"3, Carl House, UK"]}
private static int getmyId(string name)
{
...
List<Dictionary<string, string>> myList = new List<Dictionary<string, string>>();
foreach (Dictionary<string, string> item in myList)
{
if (item.ContainsValue(name))
{
myID = item["Someid"];
}
}
...
return myID
}
答案 0 :(得分:2)
从字典中的值获取密钥有点棘手,因为可以重用值。因此,您需要返回一个键列表,或者让该函数只返回第一个匹配键。
这两种方法都是静态函数:
static List<string> GetKeysFromValue(Dictionary<string,string> dict, string val)
{
if(!dict.ContainsValue(val))
return new List<string>(); //return EMPTY list for no matching keys
return dict.Where(kv => kv.Value.Equals(val)).Select(kv => kv.Key).ToList();
}
解释上述内容:
Where
linq函数获取字典中具有匹配值的所有键值对。 IEnumerable
个KeyValuePair
个对象,然后我们调用Select
,这是一个执行投影的linq函数。这会从返回的IEnumerable<KeyValuePair>
中取出密钥。 IEnumerable<string>
.ToList()
转换为列表
醇>
要获得第一个匹配的密钥,您可以执行以下操作:
static string GetFirstKeyFromValue(Dictionary<string,string> dict, string val)
{
if(!dict.ContainsValue(val))
return null; //return null because nothing matched.
return dict.FirstOrDefault(kv => kv.Value.Equals(val)).Key;
}
FirstOrDefault
将返回字典中的第一个匹配键值对,如果没有找到,则返回null
。由于我们已经检查过它会使用ContainsValue()
方法提前返回,我们可以安全地调用Key
来获取键属性的值。
我还想指出,根据您发布的方法签名,您将Dictionary<string,string>
视为List<string>
。字典没有索引,因此使用用户定义的密钥类型。因此,没有理由返回int
,因为没有索引。相反,你应该返回密钥,你发布的是一个字符串。