通过值获取字典的键

如何在C#中通过值获得一个字典的键?

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

我想要这样的东西。

getByValueKey(string value);

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

什么是最好的方法?也许是HashTable,SortedLists?

对该问题的评论 (5)
解决办法

值不一定是唯一的,所以你必须做一个查询。你可以这样做。

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

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

评论(13)

你可以这样做。

1.通过循环浏览字典中所有的 KeyValuePair's(如果你在字典中有许多条目,这将是一个相当大的性能打击)。 2.使用两个字典,一个用于值到键的映射,一个用于键到值的映射(这将占用两倍于内存的空间)。

如果性能不是一个考虑因素,就使用方法1,如果内存不是一个考虑因素,就使用方法2。

另外,所有的键必须是唯一的,但值不要求是唯一的。 你可以有一个以上的具有指定值的键。

有什么理由你不能颠倒键值关系吗?

评论(2)

我当时的情况是,Linq绑定不可用,不得不显式扩展lambda。 结果得到了一个简单的函数。

public static T KeyByValue<T, W>(this Dictionary<T, W>
dict, W val)
{
T键=默认。
foreach (KeyValuePair<T, W>
pair in dict)
{
如果(EqualityComparer<W>.Default.Equals(pair.Value, val))
{
key = pair.Key.Key;
break;
}
}
return key;
}

称之为如下。

public static void Main()
{
    Dictionary dict = new Dictionary()
    {
        {"1", "one"},
        {"2", "two"},
        {"3", "three"}
    };

    string key = KeyByValue(dict, "two");         
    Console.WriteLine("Key: " + key);
}

在.NET 2.0和其他有限的环境中工作。

评论(1)

我已经创建了一个双查找类。


/// 
/// dictionary with double key lookup
/// 
/// primary key
评论(0)

也许是这样的。

foreach (var keyvaluepair in dict)
{
    if(Object.ReferenceEquals(keyvaluepair.Value, searchedObject))
    {
        //dict.Remove(keyvaluepair.Key);
        break;
    }
}
评论(0)
types.Values.ToList().IndexOf("one");

Values.ToList() 将你的字典值转换为一个对象列表。 IndexOf("one") 搜索你的新List,寻找"one" 并返回与字典中的键/值对的索引相匹配的索引。

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

请记住,在你的字典中可能有多个"one" 值。 这就是没有"get key&quot.方法的原因。 方法的原因。

评论(0)

下面的代码只有在包含唯一值数据的情况下才会生效

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

        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;
}
评论(2)

我有非常简单的方法来做到这一点。它对我来说是完美的。

Dictionary types = new Dictionary();

types.Add("1", "one");
types.Add("2", "two");
types.Add("3", "three");

Console.WriteLine("Please type a key to show its value: ");
string rLine = Console.ReadLine();

if(types.ContainsKey(rLine))
{
    string value_For_Key = types[rLine];
    Console.WriteLine("Value for " + rLine + " is" + value_For_Key);
}
评论(3)