recorrer c# asp.net .net .net-3.5

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