3

Dictionary.Valuesあるアプリケーションのコードを確認したところ、コレクションに要素が追加されたのと同じ順序であると想定されていることがわかりました。

私はこれが本当かどうかをテストするためのアプリケーションを書きました:

using System;
using System.Collections.Generic;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, int> values = new Dictionary<string, int>();

            values.Add("apple2", 2);
            values.Add("apple3", 3);
            values.Add("apple4", 4);
            values.Add("apple5", 5);
            values.Add("apple6", 6);
            values.Add("apple1", 1);

            var list = new List<int>(values.Values);

            for (int i = 0; i < list.Count; i++)
            {
                Console.WriteLine(list[i]);
            }

        }
    }
}

そして出力は次のとおりです。

2
3
4
5
6
1

まず第一に、それはどのように可能であるのだろうか。辞書は順序付けられていないツリーなどを使用することになっているのではありませんか?

さらに、MSDNは次のように述べています。

の値の順序は指定されていませんが、Keysプロパティによって返されるDictionary<TKey, TValue>.ValueCollection関連するキーと同じ順序です。Dictionary<TKey, TValue>.KeyCollection

では、なぜMSDNは「順序は指定されていません」と言っているのに、実装はたまたま順序を維持しているのでしょうか。その事実に頼らないほうがいいというのは正しいですか?

4

3 に答える 3

5

その事実に頼らないほうがいいというのは正しいですか?

絶対。順序を維持することがあるからといって、将来の実装で実行されることを意味するわけではなく、実際にすべての場合に現在実行されることを意味するわけでもありません。

内部データ構造のサイズが変更された場合、またはアイテムが削除された場合、順序が変更される可能性があります。

たとえば、リストを作成する前にこのコードを追加すると、次のようになります。

values.Remove("apple4");
values.Add("jon", 10);

私のボックスでは、5、6、および1のエントリの後に追加されたにもかかわらず、値10が4の前の場所に来ることがわかります。

あなたは間違いなく、間違いなく注文に頼るべきではありません。

于 2012-11-17T13:45:11.657 に答える
2

偶然に値を順番に取得しているのは、データが順番に表示されていることが原因である可能性があります。混合順序の要素を変更し、要素を追加して削除すると、その順序が変更されます。あなたは注文に頼ることはできません。

于 2012-11-17T13:45:19.497 に答える
0

その動作が必要な場合は、明示的な順序付き辞書を使用する必要があります。

http://msdn.microsoft.com/en-us/library/system.collections.specialized.ordereddictionary.aspx

于 2012-11-17T14:02:16.973 に答える