recorrer - dictionary c# get value by key
Obtener el primer elemento de un diccionario (6)
Tengo la siguiente declaración:
Dictionary<string, Dictionary<string, string>> like = new Dictionary<string, Dictionary<string, string>>();
Necesito sacar el primer elemento, pero no conozco la clave o el valor. ¿Cuál es la mejor manera de hacer esto?
Aunque puede utilizar First() , los diccionarios no tienen orden per se. Por favor, use OrderedDictionary en OrderedDictionary lugar. Y luego puedes hacer FirstOrDefault . De esta manera será significativo.
Diccionario no define el orden de los elementos. Si solo necesita un elemento, use las propiedades de Keys o Values del diccionario para elegir uno.
EDITAR: Use un OrderedDictionary.
Es mejor usar FirstOrDefault() para recuperar el primer valor.
Ex:
var firstElement = like.FirstOrDefault();
string firstElementKey = firstElement.Key;
Dictinary<string,string> firstElementValue = firstElement.Value;
Para cualquier persona que venga a esto, quiere una forma sin linq de obtener un elemento de un diccionario.
var d = new Dictionary<string, string>();
d.Add("a", "b");
var e = d.GetEnumerator();
e.MoveNext();
var anElement = e.Current;
// anElement/e.Current is a KeyValuePair<string,string>
// where Key = "a", Value = "b"
No estoy seguro de que esto sea específico de la implementación, pero si su Diccionario no tiene ningún elemento, Current contendrá un KeyValuePair<string, string> donde tanto la clave como el valor son null .
(Miré la lógica detrás del First método de linq para llegar a esto, y lo probé a través de LinqPad 4 )
Tenga en cuenta que llamar First es llamar a la extensión Linq de IEnumerable, que se implementa mediante el Dictionary<TKey,TValue> . Pero para un diccionario, "primero" no tiene un significado definido. De acuerdo con esta respuesta , el último elemento agregado termina siendo el "Primero" (en otras palabras, se comporta como una pila ), pero eso es específico de la implementación, no es el comportamiento garantizado . En otras palabras, suponer que obtendrá un elemento definido al llamar Primero sería pedir problemas: su uso debe tratarse como si fuera un elemento aleatorio del Diccionario, como lo señala Bobson a continuación. Sin embargo, a veces esto es útil, ya que solo necesita cualquier elemento del Diccionario.
Solo usa el Linq First() :
var first = like.First();
string key = first.Key;
Dictionary<string,string> val = first.Value;
Tenga en cuenta que usar First en un diccionario le da un KeyValuePair , en este caso KeyValuePair<string, Dictionary<string,string>> .
Tenga en cuenta también que podría derivar un significado específico del uso de First al combinarlo con Linq OrderBy :
var first = like.OrderBy(kvp => kvp.Key).First();
Dictionary<string, Dictionary<string, string>> like = new Dictionary<string, Dictionary<string, string>>();
Dictionary<string, string> first = like.Values.First();