На самом деле, в C # 2.0 вы можете создать свой собственный итератор, который перебирает контейнер в обратном порядке. Затем вы можете использовать этот итератор в своем выражении foreach. Но ваш итератор должен иметь способ навигации по контейнеру. Если это простой массив, он может вернуться назад так:
static IEnumerable<T> CreateReverseIterator<T>(IList<T> list)
{
int count = list.Count;
for (int i = count - 1; i >= 0; --i)
{
yield return list[i];
}
}
Но, конечно, вы не можете сделать это с помощью словаря, так как он не реализует IList или не предоставляет индексатор. Сказать, что в Словаре нет порядка, не так: конечно, у него есть порядок. Этот порядок может быть даже полезен, если вы знаете, что это такое.
Для решения вашей проблемы: я бы сказал, скопировать элементы в массив и использовать вышеупомянутый метод, чтобы пройти его в обратном порядке. Как это:
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);
}
}
Копирование ваших значений в массив может показаться плохой идеей, но в зависимости от типа значения это не так уж и плохо. Вы можете просто копировать ссылки!