-1

私は典型的な多次元配列を持っていますが、サブ配列ごとにキーのようなものを追加する必要があります。JSONのように。

構造の例:

{
    "0":
    {
        "1":
        {
            {1, 5, 9, 55}
        },
        "5":
        {
            {97, 82, 5}
        }
    },
    "2":
    {
        "0":
        {
            {9}
        },
        "2":
        {
            {3, 2, 2, 1, 4}
        }
    },
    "10":
    {
        "6":
        {
            {9, 10}
        },
        "7":
        {
            {0, 8, 2}
        }
    }
}

私は例でそれを説明しようとします:

variable[0] would be equal "0"
variable[1] would be equal "2"
variable[3] would be equal "10"

variable[0][0] would be equal "1"
variable[0][1] would be equal "5"

variable[1][0] would be equal "0"
variable[1][1] would be equal "2"

variable[0][0][0] would be equal "1"
variable[0][0][1] would be equal "5"
variable[0][0][2] would be equal "9"
variable[0][0][3] would be equal "55"

variable[0][1][0] would be equal "97"
variable[0][1][1] would be equal "82"
variable[0][1][2] would be equal "5"

より多くの変数を使用してそれを行うことができますが、将来変更する必要がある可能性のある非常に多くのデータがあるため、上記のように構造化する必要があります. C# でこれを行うための最も効率的なソリューションは何ですか?

多次元辞書を試しましたが、構文が間違っています:

Dictionary<byte, Dictionary<byte, Dictionary<byte, Dictionary<byte, string>>>> scope = new Dictionary<byte, Dictionary<byte, Dictionary<byte, Dictionary<byte, string>>>>()
{
    {
        0,
        {
            1,
            {
                1,
                {
                    1, "test"
                }
            }
        }
    }
};
textBox1.Text = scope[0][0][0][0];

何が問題なのですか?

そしてもう1つ質問です。これらの括弧を実行します: "()" はこれの最後に属します:

Dictionary<byte, Dictionary<byte, Dictionary<byte, Dictionary<byte, string>>>> scope = new Dictionary<byte, Dictionary<byte, Dictionary<byte, Dictionary<byte, string>>>>()?

4

2 に答える 2

1

多次元辞書を試しましたが、構文が間違っています

int初期化構文では、単純な定数 (や などstring) のみを直接追加できます。新しいオブジェクト (辞書) が必要なので、次のようになります。

var scope = new Dictionary<byte, Dictionary<byte, Dictionary<byte, Dictionary<byte, string>>>>
{
    { 0, new Dictionary<byte, Dictionary<byte, Dictionary<byte, string>>>
          {
             { 0,  new Dictionary<byte, Dictionary<byte, string>>
                  ...
             }
          }
    },
    { 1, new Dictionary<byte, Dictionary<byte, Dictionary<byte, string>>>
          {
             ...
          }
    },

};
  • ここで使用する意味はありませんbyteint少数が必要な場合は常に使用してください。
于 2013-08-18T20:48:07.880 に答える
0

Henk Holtermanが指摘した構文の問題に加えて、サブ辞書をキー 1 で初期化すると、次のようになります。

textBox1.Text = scope[0][0][0][0];

をスローしKeyNotFoundExceptionます。これはうまくいくはずです:

textBox1.Text = scope[0][1][1][1];

いいえ、そのような初期化子を使用してパラメーターなしのコンストラクターを呼び出す場合、括弧は必要ありません。

ただし、Dictionary<Tuple<byte, byte, byte, byte>, string>代わりに a を使用することをお勧めします。これを行うことができます。

var scope = new Dictionary<Tuple<byte, byte, byte, byte>, string>
{
    {
        Tuple.Create<byte, byte, byte, byte>(0, 1, 1, 1), "test"
    }
};

textBox1.Text = scope[Tuple.Create<byte, byte, byte, byte>(0, 1, 1, 1)];

a を使用するとDictionary<Tuple<int, int, int, int>, string>、構文はもう少し優雅になります。

var scope = new Dictionary<Tuple<int, int, int, int>, string>
{
    {
        Tuple.Create(1, 1, 1), "test"
    }
};

textBox1.Text = scope[Tuple.Create(0, 1, 1, 1)];

または、これをまとめてより便利なインデクサーを提供する独自のクラスを作成することもできます。

public class MyMultiKeyDictionary : 
    ICollection<KeyValuePair<Tuple<int, int, int, int>, string>>
{
    private Dictionary<Tuple<int, int, int, int>, string> dict;

    public string this[int w, int x, int y, int z]
    {
        get { return this.dict[Tuple.Create(w, x, y, z)]; }
        set { this.dict[Tuple.Create(w, x, y, z)] = value; }
    }

    // ... implement ICollection
}

var scope = new MyMultiKeyDictionary 
{
    {
        Tuple.Create(1, 1, 1), "test"
    }
};

textBox1.Text = scope[0, 1, 1, 1];

ただし、任意のキーがある場合は、辞書が役立ちます。キーがすべて 0 から N まで変化することがわかっている場合は、単純なstring[][][]ものが最も簡単なソリューションです。

于 2013-08-18T20:46:24.863 に答える