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


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

6

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

string[,] Tablero =  {
                        { "a", "b", "c" },
                        { "d", "e", "f" }, 
                        { "g", "h", "i"} 
                     };


@JohnSaunders я не вижу. Игнорировать весь тип в правой части - это другое дело.
nawfal

1
Нет, точно так же.
Джон Сондерс

1
@JohnSaunders Я предлагал другой способ инициализации. Не многие знают, что она может опускать размер и даже печатать на правой стороне во время инициализации массива. Конечно, делает то же самое. Поскольку вопрос больше похож на «как мне объявить / инициализировать», это тоже один из способов. См. Ответ Эрика, в котором он отдельно упоминает каждую технику.
nawfal

2
Ну ладно. Я бы избавился от своего отрицательного голоса, но он, кажется, уже исчез.
Джон Сондерс

6

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

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

3

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

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

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.