una termino sucesion esimo enesimo calculo aritmetica c# dictionary

c# - termino - ¿Cómo obtengo el enésimo elemento de un diccionario?



n-esimo termino de una sucesion aritmetica (9)

cipher = new Dictionary<char,int>; cipher.Add( ''a'', 324 ); cipher.Add( ''b'', 553 ); cipher.Add( ''c'', 915 );

¿Cómo obtener el segundo elemento? Por ejemplo, me gustaría algo como:

KeyValuePair pair = cipher[1]

Donde el par contiene ( ''b'', 553 )

Con base en la sugerencia de la cooperativa de utilizar una lista, las cosas funcionan:

List<KeyValuePair<char, int>> cipher = new List<KeyValuePair<char, int>>(); cipher.Add( new KeyValuePair<char, int>( ''a'', 324 ) ); cipher.Add( new KeyValuePair<char, int>( ''b'', 553 ) ); cipher.Add( new KeyValuePair<char, int>( ''c'', 915 ) ); KeyValuePair<char, int> pair = cipher[ 1 ];

Suponiendo que tengo razón en que los elementos permanecen en la lista en el orden en que se agregaron, creo que puedo usar una List en lugar de una List SortedList como se sugiere.


¿De verdad necesitas mirar hacia arriba por la llave? Si no, use una List<KeyValuePair<char, int>> (o mejor aún, cree un tipo para encapsular el char y el int).

Los diccionarios no se clasifican inherentemente: las implementaciones de diccionario que se ordenan en .NET se ordenan por clave, no por orden de inserción.

Si necesita acceder a la colección tanto por orden de inserción como por clave, recomendaría encapsular una Lista y un Diccionario en un único tipo de colección.

Alternativamente, si la lista va a ser bastante corta, permita buscar por índice simplemente haciendo una búsqueda lineal ...


El problema es que un diccionario no está ordenado. Lo que quiere es una SortedList , que le permite obtener valores por índice y por clave, aunque es posible que necesite especificar su propio comparador en el constructor para obtener la ordenación que desee. A continuación, puede acceder a una lista ordenada de claves y valores, y usar varias combinaciones de los métodos IndexOfKey / IndexOfValue según sea necesario.


Esta es una vieja pregunta, pero fue útil para mí. Aquí hay una implementación que utilicé. Quería que el enésimo elemento se basara en el orden de inserción.

public class IndexedDictionary<TKey, TValue> : IEnumerable<TValue> { private List<TValue> list = new List<TValue>(); private Dictionary<TKey, TValue> dict = new Dictionary<TKey, TValue>(); public TValue this[int index] { get { return list[index]; } } public TValue this[TKey key] { get { return dict[key]; } } public Dictionary<TKey, TValue>.KeyCollection Keys { get { return dict.Keys; } } public int Count { get { return list.Count; } } public int IndexOf(TValue item) { return list.IndexOf(item); } public int IndexOfKey(TKey key) { return list.IndexOf(dict[key]); } public void Add(TKey key, TValue value) { list.Add(value); dict.Add(key, value); } IEnumerator<TValue> IEnumerable<TValue>.GetEnumerator() { return list.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return list.GetEnumerator(); } }


Hubo un engaño de esta pregunta: ¿Cómo recuperar Nth artículo en el diccionario? . Debería cerrarse pronto, pero noté que a las respuestas aquí les falta la nueva clase OrderedDictionary.

Ahora existe (a partir de .NET 4), una clase OrderedDictionary . Esto permite búsquedas rápidas al tiempo que proporciona pedidos. El método Item (Int32) devuelve el enésimo elemento.


Me gusta esto:

int n = 0; int nthValue = cipher[cipher.Keys.ToList()[n]];

Tenga en cuenta que también necesitará una referencia a Linq en la parte superior de su página ...

using System.Linq;


NO intente esto: esta fue una idea tonta, lo siento muchachos!

cipher.Values[1] cipher.Keys[1]

porque el elemento 2ND es el índice 1!


Puede aplicar la siguiente consulta LINQ en su Dictionary ''cifrado''

var cipher = new Dictionary<char, int>(); cipher.Add(''a'', 324); cipher.Add(''b'', 553); cipher.Add(''c'', 915); var nThValue = cipher.Select((Val, Index) => new { Val, Index }) .Single(viPair => viPair.Index == 1) //Selecting dictionary item with it''s index using index .Val //Extracting KeyValuePair from dictionary item .Value; //Extracting Value from KeyValuePair


Puede usar ElementAt() esta manera:

cipher.ElementAt(index);

Es mejor que la opción Select porque de esta manera no tienes que recorrer el diccionario:

documentación

/// <summary>Returns the element at a specified index in a sequence.</summary> /// <returns>The element at the specified position in the source sequence.</returns> /// <param name="source">An <see cref="T:System.Collections.Generic.IEnumerable`1" /> to return an element from.</param> /// <param name="index">The zero-based index of the element to retrieve.</param> /// <typeparam name="TSource">The type of the elements of <paramref name="source" />.</typeparam> /// <exception cref="T:System.ArgumentNullException"> /// <paramref name="source" /> is null.</exception> /// <exception cref="T:System.ArgumentOutOfRangeException"> /// <paramref name="index" /> is less than 0 or greater than or equal to the number of elements in <paramref name="source" />.</exception>


Solo para aferrarme a tu especificación original para un Diccionario, lancé un código y se me ocurrió:

Dictionary<string, string> d = new Dictionary<string, string>(); d.Add("a", "apple"); d.Add("b", "ball"); d.Add("c", "cat"); d.Add("d", "dog"); int t = 0; foreach (string s in d.Values) { t++; if (t == 2) Console.WriteLine(s); }

y parece escribir el segundo elemento ("bola") repetidamente en la consola. Si lo envuelve en una llamada a método para obtener el enésimo elemento, probablemente funcione. Esto es bastante feo, sin embargo. Si pudiera hacer una SortedList en su lugar, como sugiere @thecoop, estaría mejor.