elementat c# dictionary

c# - elementat - obtener la clave del diccionario por valor



c# dictionary initialization (7)

¿Cómo obtengo una clave de diccionario por valor en C #?

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

Quiero algo como esto:

getByValueKey(string value);

getByValueKey("one") debe ser devuelto "1" .

¿Cuál es la mejor manera de hacer esto? Tal vez HashTable, SortedLists?


El siguiente código solo funciona si contiene datos de valor único

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


Estaba en una situación en la que el enlace de Linq no estaba disponible y tuve que expandir lambda explícitamente. Resultó en una función simple:

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

Llámalo como sigue:

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

Funciona en .NET 2.0 y en otros entornos limitados.


Los valores no necesariamente tienen que ser únicos para que tenga que hacer una búsqueda. Puedes hacer algo como esto:

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

Si los valores son únicos y se insertan con menos frecuencia que los leídos, cree un diccionario inverso donde los valores son claves y los claves son valores.


Podrías hacer eso:

  1. Haciendo un bucle a través de todos los KeyValuePair<TKey, TValue> en el diccionario (lo que será un gran éxito de rendimiento si tiene varias entradas en el diccionario)
  2. Utilice dos diccionarios, uno para la asignación de valor a clave y otro para la asignación de clave a valor (que ocuparía el doble de espacio en la memoria).

Use el Método 1 si el rendimiento no es una consideración, use el Método 2 si la memoria no es una consideración.

Además, todas las claves deben ser únicas, pero no se requiere que los valores sean únicos. Puede tener más de una clave con el valor especificado.

¿Hay alguna razón por la que no pueda revertir la relación clave-valor?


Tengo una forma muy sencilla de hacer esto. Funcionó perfecto para mí.

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


tal vez algo como esto:

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


types.Values.ToList().IndexOf("one");

Values.ToList () convierte los valores de su diccionario en una lista de objetos. IndexOf ("one") busca en su nueva Lista buscando "one" y devuelve el Índice que coincidiría con el índice del par de Clave / Valor en el diccionario.

Este método no se preocupa por las claves del diccionario, simplemente devuelve el índice del valor que está buscando.

Tenga en cuenta que puede haber más de un valor "uno" en su diccionario. Y esa es la razón por la que no hay un método de "obtener clave".