実際、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 を実装していないか、インデクサーを提供していないため、Dictionary ではもちろんそれを行うことはできません。Dictionary に順序がないと言うのは正しくありません。もちろん順序があります。その順序は、それが何であるかを知っていれば役立ちます。
あなたの問題を解決するには:要素を配列にコピーし、上記の方法を使用して逆にトラバースします。このような:
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);
}
}
値を配列にコピーするのは悪い考えのように思えるかもしれませんが、値の型によってはそれほど悪いことではありません。参照をコピーしているだけかもしれません。