valores valor obtener listas iterar ejemplos diccionario declarar cambiar c# .net dictionary

listas - obtener valor de un diccionario c#



Obtener el último elemento en un diccionario? (12)

Mi diccionario:

Dictionary<double, string> dic = new Dictionary<double, string>();

¿Cómo puedo devolver el último elemento en mi diccionario?


¿Qué quieres decir con último? ¿Te refieres al último valor agregado?

La clase Dictionary<TKey,TValue> es una colección no ordenada. Agregar y eliminar elementos puede cambiar lo que se considera el primer y último elemento. Por lo tanto, no hay manera de obtener el Último elemento agregado.

Hay una clase de diccionario ordenada disponible en forma de SortedDictionary<TKey,TValue> . Pero esto se ordenará basándose en la comparación de las claves y no en el orden en que se agregaron los valores.

EDITAR

Varias personas han mencionado el uso del siguiente enfoque de estilo LINQ

var last = dictionary.Values.Last();

Tenga mucho cuidado con el uso de este método. Devolverá el último valor en la colección de valores. Este puede o no ser el último valor que agregó al Diccionario. Probablemente sea tan probable que no sea como es.


Con .Net 3.5:

string lastItem = dic.Values.Last() string lastKey = dic.Keys.Last()

... pero tenga en cuenta que un diccionario no está ordenado, por lo que no puede contar con el hecho de que los valores permanecerán en el mismo orden.


Considere crear una colección personalizada que contenga una referencia en el método Add de la colección personalizada. Esto establecería un campo privado que contiene la última clave / valor agregado (o ambos) según sus requisitos.

Luego, tenga un método Last() que devuelva esto. Aquí hay una prueba de clase de concepto para mostrar lo que quiero decir (por favor, no rechace la falta de implementación de la interfaz, es un código de ejemplo):

public class LastDictionary<TKey, TValue> { private Dictionary<TKey, TValue> dict; public LastDictionary() { dict = new Dictionary<TKey, TValue>(); } public void Add(TKey key, TValue value) { LastKey = key; LastValue = value; dict.Add(key, value); } public TKey LastKey { get; private set; } public TValue LastValue { get; private set; } }


De los docs :

Para los fines de la enumeración, cada elemento del diccionario se trata como una estructura KeyValuePair que representa un valor y su clave. El orden en el que se devuelven los artículos no está definido .

Por lo tanto, no creo que pueda confiar en el Dictionary para devolver el último elemento.

Utiliza otra colección. Tal vez SortedDictionary ...


En lugar de usar Linq como la mayoría de las otras respuestas, puede acceder al último elemento de cualquier objeto de Colección a través de la propiedad Count (consulte la propiedad ICollection.Count para obtener más información).

Vea el código aquí para ver un ejemplo de cómo usar el conteo para acceder al elemento final en cualquier Colección (incluido un Diccionario):

Dictionary<double, string> dic = new Dictionary<double, string>(); var lastElementIndex = dic.Count - 1; var lastElement = dic[lastElementIndex];

Tenga en cuenta que esto devuelve el último valor , no la clave.


En lugar de usar:

Dictionary<double, string>

... podrías usar:

List<KeyValuePair<double, string>>

Esto le permitiría usar el indexador para acceder al elemento por orden en lugar de por clave.


Los diccionarios son colecciones desordenadas, como tal, no hay concepto de un primer o último elemento. Si está buscando una clase que se comporte como un diccionario pero mantiene el orden de inserción de los artículos, considere el uso de OrderedDictionary .

Si está buscando una colección que SortedDictionary<TKey,TValue> los elementos, considere usar SortedDictionary<TKey,TValue> .

Si tiene un diccionario existente y está buscando el elemento ''último'' dado un cierto orden, puede usar linq para ordenar la colección, algo como:

myDictionary.Values.OrderBy( x => x.Key ).Last();

Al tener cuidado con el uso de Dictionary.Keys.Last() , mientras que la lista de claves se ordena utilizando el valor predeterminado de IComparer para el tipo de clave, es posible que el valor que obtenga no sea el valor que espera.


Podrías usar:

dic.Last()

Pero un diccionario no tiene realmente un último elemento (los pares en el interior no están ordenados de ninguna manera en particular). El último elemento siempre será el mismo, pero no es obvio qué elemento podría ser.


Sé que esta pregunta es demasiado antigua para obtener votos positivos, pero no me gustó ninguna de las respuestas, así que publicaré la mía con la esperanza de ofrecer otra opción a los futuros lectores.

Lo siguiente no me funcionó en .NET 4.0:

myDictionary.Values.OrderBy( x => x.Key ).Last();

Sospecho que el problema es que la ''x'' representa un valor en el diccionario, y un valor no tiene clave (el diccionario almacena la clave, los valores del diccionario no). También puedo estar cometiendo un error en el uso de la técnica.

De cualquier manera, esta solución sería lenta para los diccionarios grandes, probablemente O (n log n) para la gente de CS, porque está ordenando todo el diccionario solo para obtener una entrada. Es como reorganizar toda tu colección de DVD solo para encontrar una película específica.

var lastDicVal = dic.Values.Last();

Está bien establecido como una mala idea. En la práctica, esta solución realmente funciona la mayor parte del tiempo debido a la implementación del diccionario por parte de Microsoft, pero en términos de ingeniería de software no tiene sentido y no se debe confiar en ella. Incluso si funciona cada vez por el resto de la eternidad, representa una práctica de codificación insegura y descuidada.

Mi solución es la siguiente:

var lastValue = dic[dic.Keys.Max()];

La función Keys.max () es mucho más rápida que ordenar O (n) en lugar de O (n log n) . Si el rendimiento es lo suficientemente importante como para que incluso O (n) sea ​​demasiado lento, se puede rastrear la última clave insertada en una variable separada que se usa para reemplazar dic.Keys.Max () , lo que hará que toda la búsqueda sea O (1) más la sobrecarga. existe en el seguimiento de la última entrada insertada.


Si estás utilizando .NET 3.5, mira:

dic.Keys.Last()

Sin embargo, si quieres un orden predecible, usa:

IDictionary<int, string> dic = new SortedDictionary<int, string>();


Si solo quieres el valor, esto debería funcionar (asumiendo que puedes usar LINQ):

dic.Values.Last()


Un diccionario no está destinado a ser accedido en orden, por lo que primero, último no tiene significado. ¿Desea que el valor sea indexado por la clave más alta?

Dictionary<double, string> dic = new Dictionary<double, string>(); double highest = double.MinValue; string result = null; foreach(double d in dic.keys) { if(d > highest) { result = dic[d]; highest = d; } }