根据价值获得字典关键字

可能重复:
获得一个通用字典的价值的关键?

如何通过C#中的值获取字典键?

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

我想要这样的东西:

 getByValueKey(string value); 

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

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

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

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

如果值是唯一的,插入次数比读取次数less,则创build一个反向字典,其中值是键,键是值。

你可以这样做:

  1. 通过循环遍历字典中的所有KeyValuePair<TKey, TValue> (如果字典中有多个条目,这将是一个相当大的性能问题)
  2. 使用两个词典,一个用于值到键的映射,另一个用于键值映射(这将占用内存空间的两倍)。

如果不考虑性能,请使用方法1,如果不考虑内存,请使用方法2。

而且,所有的密钥必须是唯一的,但是这些值不必是唯一的。 您可能有多个具有指定值的键。

有没有什么理由不能扭转关键价值关系?

如果一个以上的密钥存在价值呢?

哪个键应该返回?

为了避免做出假设,Microsoft没有包含GetKey方法。

也许是这样的:

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

Values.ToList()将您的字典值转换为对象列表。 IndexOf(“one”)会search新的List,查找“one”,并返回与字典中的Key / Value对的索引匹配的Index。

此方法不关心字典键,它只是返回您正在查找的值的索引。

请记住,字典中可能有多个“一个”值。 这就是没有“得到钥匙”的原因。

以下代码仅适用于包含唯一值数据的情况

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

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

 Dictionary<string, string> types = new Dictionary<string, string>(); 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); }