En realidad, en C# 2.0 puede crear su propio iterador que atraviesa un contenedor en reversa. Entonces, puedes usar ese iterador en tu declaración de foreach. Pero su iterador debería tener una forma de navegar el contenedor en primer lugar. Si se trata de una matriz simple, se podría ir hacia atrás como esto:
static IEnumerable<T> CreateReverseIterator<T>(IList<T> list)
{
int count = list.Count;
for (int i = count - 1; i >= 0; --i)
{
yield return list[i];
}
}
Pero por supuesto no se puede hacer eso con un diccionario, ya que no implementa IList o proporciona un indexador. Decir que un diccionario no tiene orden no es cierto: por supuesto que tiene orden. Ese orden incluso puede ser útil si sabes de qué se trata.
Para una solución a su problema: Yo diría copiar los elementos a una matriz, y utilizar el método anterior para recorrerlo en reversa. De esta manera:
static void Main(string[] args)
{
Dictionary<int, string> dict = new Dictionary<int, string>();
dict[1] = "value1";
dict[2] = "value2";
dict[3] = "value3";
foreach (KeyValuePair<int, string> item in dict)
{
Console.WriteLine("Key : {0}, Value: {1}", new object[] { item.Key, item.Value });
}
string[] values = new string[dict.Values.Count];
dict.Values.CopyTo(values, 0);
foreach (string value in CreateReverseIterator(values))
{
Console.WriteLine("Value: {0}", value);
}
}
Copiar sus valores en una matriz que puede parecer una mala idea, pero dependiendo del tipo de valor que en realidad no es tan malo. ¡Podrías estar copiando referencias!
Oh sí. Duh. Soy completamente estúpido. Gracias :-) – Pandincus
Utilice SortedList si desea búsquedas de tipo hashtable, así como el orden de secuencia de estilo de arrays. Alguien ya ha publicado un fragmento de código. – Gishu
¡Por supuesto que una tabla hash tiene un pedido! –