我如何得到一个字典键值在c# ?

Dictionary<string, string> types = new Dictionary<string, string>()
{
    {"1", "one"},
    {"2", "two"},
    {"3", "three"}
};

我想要这样的东西:

getByValueKey(string value);

getByValueKey("one")必须返回"1"。

最好的方法是什么?也许是哈希表或排序列表?


当前回答

public static string GetKeyFromValue(string valueVar)
{
    foreach (string keyVar in dictionaryVar.Keys)
    {
        if (dictionaryVar[keyVar] == valueVar)
        {
            return keyVar;
        }
    }
    return null;
}

其他人可能有更有效的答案,但我个人觉得这个更直观,对我来说很管用。

其他回答

keys中的键的顺序是未指定的,但它与values中的相关值相同(来自c#文档)。

因此,(在某些情况下)对值的集合执行此操作的有效方法如下:

    /// <summary>
    /// Gets the 1st key matching each value
    /// </summary>
    public static IEnumerable<TKey> GetKeys<TKey,TValue>(this Dictionary<TKey, TValue> dic, IEnumerable<TValue> values) where TKey : notnull
    {
        //The order of the keys in Keys is unspecified, but it is the same as the associated values in Values
        var dicKeys = dic.Keys.ToList();
        var dicValues = dic.Values.ToList();
        foreach (var value in values)
        {
            var i = dicValues.IndexOf(value); //Will return the index of the 1st found value, even when multiple values are present
            //we could test if i==-1 there.
            yield return dicKeys[i];
        }
    }
types.Values.ToList().IndexOf("one");

values . tolist()将您的字典值转换为对象列表。 IndexOf("one")搜索你的新列表,寻找"one",并返回与字典中Key/Value对的索引匹配的Index。

这个方法并不关心字典中的键,它只是返回您正在寻找的值的索引。

请记住,在你的字典中可能有不止一个“1”值。这就是没有“get key”方法的原因。

值不一定是唯一的,所以必须进行查找。你可以这样做:

var myKey = types.FirstOrDefault(x => x.Value == "one").Key;

如果值是唯一的,并且插入的频率低于读取,那么创建一个反向字典,其中值是键,键是值。

也许是这样的:

foreach (var keyvaluepair in dict)
{
    if(Object.ReferenceEquals(keyvaluepair.Value, searchedObject))
    {
        //dict.Remove(keyvaluepair.Key);
        break;
    }
}

下面的代码只在包含唯一值数据时有效:

public string getKey(string Value)
{
    if (dictionary.ContainsValue(Value))
    {
        var ListValueData = new List<string>();
        var ListKeyData   = new List<string>();

        var Values = dictionary.Values;
        var Keys = dictionary.Keys;

        foreach (var item in Values)
        {
            ListValueData.Add(item);
        }

        var ValueIndex = ListValueData.IndexOf(Value);
        foreach (var item in Keys)
        {
            ListKeyData.Add(item);
        }

        return  ListKeyData[ValueIndex];
    }
    return string.Empty;
}