На самом деле, в 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);
}
}
Копирование значений в массиве может показаться, что это плохая идея, но в зависимости от типа значения это не так уж плохо. Вы можете просто копировать ссылки!
Ах да. Duh. Я совершенно глуп. Спасибо :-) – Pandincus 2008-09-17 13:04:10
Используйте SortedList, если вы хотите, чтобы поиск типов хеш-таблиц, а также порядок упорядочивания стиля Arrayylist. Кто-то уже разместил фрагмент кода. – Gishu 2008-09-17 13:41:33
Конечно, хэш-таблица имеет заказ! – 2011-11-04 12:28:49