Как я могу объявить двумерный массив строк?

79
string[][] Tablero = new string[3][3];

Мне нужно иметь массив 3x3 для сохранения информации. Как это объявить на C #?

Оливье Рожье
источник
3
В документации четко показано, как это сделать: msdn.microsoft.com/en-us/library/9b9dty7d.aspx
Эстебан Арая,
1
Обратите внимание, что существует разница между кодом OP [] [] (структура зубчатого массива) и принятым ответом [,] (многомерным), согласно приведенной выше ссылке.
объединить

Ответы:

110
string[,] Tablero = new string[3,3];

Вы также можете создать его экземпляр в той же строке с синтаксисом инициализатора массива следующим образом:

string[,] Tablero = new string[3, 3] {{"a","b","c"},
                                      {"d","e","f"}, 
                                      {"g","h","i"} };
исследователь
источник
2
Или, var tablero = new string[3,3];если вы используете C # 3 или новее
bdukes
9
Если вы используете синтаксис инициализатора массива, вам не нужно new string[,]
указывать
2
Вам вообще не нужно писать new string[,]...string [,] Tablero = {{"a","b","c"}, {"d","e","f"}, {"g","h","i"} }
Джим Балтер
3
Чтобы уточнить, что первые 3 в [3, 3] - это количество строк, вторые 3 - это количество столбцов (кажется, все выбрали [3, 3], чтобы запутать :-))
bytedev
54

Вы, наверное, захотите этого:

string[,] Tablero = new string[3,3];

Это создаст вам матричный массив, в котором все строки имеют одинаковую длину.

Массив в вашем примере представляет собой так называемый массив с зубчатыми краями , то есть массив массивов, элементы которого могут быть разного размера. Неровный массив нужно было бы создать другим способом:

string[][] Tablero = new string[3][];
for (int i = 0; i < Tablero.GetLength(0); i++)
{
    Tablero[i] = new string[3];
}

Вы также можете использовать инициализаторы для заполнения элементов массива данными:

string[,] Tablero = new string[,]
{
    {"1.1","1.2", "1.3"},
    {"2.1","2.2", "2.3"},
    {"3.1", "3.2", "3.3"}
};

И в случае неровного массива:

string[][] Tablero = new string[][]
{
    new string[] {"1.1","1.2", "1.3"},
    new string[] {"2.1","2.2", "2.3"},
    new string[] {"3.1", "3.2", "3.3"}
};
Дирк Фольмар
источник
15

Вы только что объявили массив с зазубринами. Такие массивы могут иметь разные размеры для всех измерений. Например:

string[][] jaggedStrings =  {
new string[] {"x","y","z"},
new string[] {"x","y"},
new string[] {"x"}
};

В вашем случае вам нужен обычный массив. См. Ответы выше. Подробнее о зубчатых массивах

Башир Магомедов
источник
11

Я предполагаю, что вы ищете это:

        string[,] Tablero = new string[3,3];

Синтаксис зубчатого массива:

        string[][] Tablero = new string[3][];
        for (int ix = 0; ix < 3; ++ix) {
            Tablero[ix] = new string[3];
        }
Ганс Пассан
источник
10

В C # есть 2 типа многомерных массивов, называемых Multidimensionalи Jagged.

Для многомерного вы можете:

строка [,] multi = новая строка [3, 3];

Для неровного массива вам нужно написать немного больше кода:

string[][] jagged = new string[3][];
            for (int i = 0; i < jagged.Length; i++)
            {
                jagged[i] = new string[3];
            }

Короче говоря, зубчатый массив работает быстрее и имеет интуитивно понятный синтаксис. Для получения дополнительной информации см .: этот вопрос о Stackoverflow

Лев
источник
3
В зубчатом случае вы можете инициализировать его напрямую, как string[][] jagged = { new[] { "a", "b", "c" }, new[] { "d", "e", "f" }, new[] { "g", "h", "i" } }; или var jagged = new[] { new[] { "a", "b", "c" }, new[] { "d", "e", "f" }, new[] { "g", "h", "i" } };
nawfal
6

string[][]это не двумерный массив, это массив массивов (а зазубренный массив ). Это что-то другое.

Чтобы объявить двумерный массив, используйте этот синтаксис:

string[,] tablero = new string[3, 3];

Если вам действительно нужен массив с зазубринами , вам нужно инициализировать его следующим образом:

string[][] tablero = new string[][] { new string[3], 
                                      new string[3], 
                                      new string[3] };
Heinzi
источник
6

Массив 3x3 (многомерный) также можно инициализировать (вы его уже объявили) следующим образом:

string[,] Tablero =  {
                        { "a", "b", "c" },
                        { "d", "e", "f" }, 
                        { "g", "h", "i"} 
                     };
науфал
источник
1
-1: это то же самое, что и stackoverflow.com/a/3814169/76337 и stackoverflow.com/a/3814164/76337
Джон Сондерс,
@JohnSaunders я не вижу. Игнорировать весь тип в правой части - это другое дело.
nawfal
1
Нет, точно так же.
Джон Сондерс
1
@JohnSaunders Я предлагал другой способ инициализации. Не многие знают, что она может опускать размер и даже печатать на правой стороне во время инициализации массива. Конечно, делает то же самое. Поскольку вопрос больше похож на «как мне объявить / инициализировать», это тоже один из способов. См. Ответ Эрика, в котором он отдельно упоминает каждую технику.
nawfal
2
Ну ладно. Я бы избавился от своего отрицательного голоса, но он, кажется, уже исчез.
Джон Сондерс
6

Когда вы пытаетесь создать многомерный массив, все, что вам нужно сделать, это добавить запятую в объявление, например:

string[,] tablero = new string[3,3].
hav2play21
источник
3

вы также можете написать код ниже.

Array lbl_array = Array.CreateInstance(typeof(string), i, j);

где 'i' - количество строк, а 'j' - количество столбцов. используя метод 'typeof (..)', вы можете выбрать тип вашего массива, т.е. int, string, double

Ставрос Афксентис
источник
0

Есть много примеров по работе с массивами в C # здесь .

Надеюсь, это поможет.

Спасибо, Дамиан

Дамиан Шенкельман
источник