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