2013-08-18 7 views
-1

У меня есть типичный многомерный массив, но мне нужно добавить что-то вроде ключа для каждого вспомогательного массива. Как и Джонс.Многомерный массив с ключом

Пример структуры:

{ 
    "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]; 

Что плохого?

И еще один вопрос. Эти скобки: «()» находятся в конце этого: Dictionary<byte, Dictionary<byte, Dictionary<byte, Dictionary<byte, string>>>> scope = new Dictionary<byte, Dictionary<byte, Dictionary<byte, Dictionary<byte, string>>>>()? Спасибо.

+0

_these brackets: "()" _ являются необязательными. –

ответ

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>>> 
      { 
      ... 
      } 
    }, 

}; 
  • нет смысла использовать byte здесь. Всегда используйте int, когда вам нужно небольшое число.
+0

Спасибо. И почему я не должен использовать байт? Он не превышает 255. – LukAss741

+0

'int' является стандартным (оптимизированным) типом. Вам нужны специальные причины использовать 'byte' или' short', а не здесь. –

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> вместо этого, так что вы можете сделать это:

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)]; 

И если вы используете 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[][][] - это самое простое решение.