在字典中知道值时获取密钥

时间:2015-03-23 13:19:37

标签: c# dictionary

我有一个字典列表,我正在搜索基于值的密钥。这该怎么做?

"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
}

1 个答案:

答案 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();
}

解释上述内容:

  1. 我们使用Where linq函数获取字典中具有匹配值的所有键值对。
  2. 现在我们有IEnumerableKeyValuePair个对象,然后我们调用Select,这是一个执行投影的linq函数。这会从返回的IEnumerable<KeyValuePair>中取出密钥。
  3. 最后,我们通过调用IEnumerable<string>
  4. .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,因为没有索引。相反,你应该返回密钥,你发布的是一个字符串。