obter chave do dictionary por valor

Como faço para obter uma chave do dictionary por valor em c #?

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

Eu quero algo assim:

 getByValueKey(string value); 

getByValueKey("one") deve ser retornar "1" .

Qual é a melhor maneira de fazer isso? Talvez HashTable, SortedLists?

Os valores não precisam necessariamente ser exclusivos, portanto, você precisa fazer uma pesquisa. Você pode fazer algo assim:

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

Se os valores forem exclusivos e inseridos com menos frequência que a leitura, crie um dictionary inverso em que os valores sejam chaves e chaves sejam valores.

Você poderia fazer isso:

  1. Fazendo um loop por todos os KeyValuePair no dictionary (que será um acerto de desempenho considerável se você tiver várias inputs no dictionary)
  2. Use dois dictionarys, um para mapeamento de valor-para-chave e outro para mapeamento de chave-para-valor (que ocuparia o dobro do espaço na memory).

Use o Método 1 se o desempenho não for uma consideração, use o Método 2 se a memory não for uma consideração.

Além disso, todas as chaves devem ser exclusivas, mas os valores não precisam ser exclusivos. Você pode ter mais de uma chave com o valor especificado.

Existe alguma razão pela qual você não pode reverter o relacionamento de valor-chave?

E se o valor existir para mais de uma chave?

Qual chave deve ser retornada?

Para evitar suposições, a Microsoft não incluiu um método GetKey .

Eu estava em uma situação em que a binding Linq não estava disponível e tinha que expandir o lambda explicitamente. Isso resultou em uma function simples:

 public static string KeyByValue(Dictionary dict, string val) { string key = null; foreach (KeyValuePair pair in dict) { if (pair.Value == val) { key = pair.Key; break; } } return key; } 

Chame da seguinte forma:

 public static void Main() { Dictionary dict = new Dictionary() { {"1", "one"}, {"2", "two"}, {"3", "three"} }; string key = KeyByValue(dict, "two"); Console.WriteLine("Key: " + key); } 

Funciona no .NET 2.0 e em outros ambientes limitados.

talvez algo assim:

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

Abaixo do código só funciona se ele contém dados de valor exclusivos

 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; } 
 types.Values.ToList().IndexOf("one"); 

Values.ToList () converte seus valores de dictionary em uma lista de objects. IndexOf (“um”) procura sua nova lista procurando por “um” e retorna o índice que corresponderia ao índice do par chave / valor no dictionary.

Este método não se importa com as chaves do dictionary, simplesmente retorna o índice do valor que você está procurando.

Tenha em mente que pode haver mais de um valor “um” em seu dictionary. E essa é a razão pela qual não existe um método “get key”.

Eu tenho uma maneira muito simples de fazer isso. Funcionou perfeito para mim.

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