Что означает объект [,] в c #? - PullRequest
7 голосов
/ 31 марта 2011

Итак, я наткнулся на некоторый мой код из старого проекта VSTO и заметил следующее:

Excel.Worksheet sheet = Globals.ThisAddIn.Application.Worksheets["Unique Hits Per URL"];
        Dictionary<int, string> ids = new Dictionary<int, string>();
        object[,] cellRange = (object[,])sheet.get_Range("E:E").Cells.Value;
        for (int i = 1; i < cellRange.GetUpperBound(0); i++)
            if (cellRange[i, 1] != null)
                ids.Add(i, cellRange[i, 1].ToString());

Что означает указание [,] для типа данных?Глядя на код, он выглядит как матрица, но, честно говоря, я думал, что матрицы c # обрабатываются с помощью нотации, подобной object [] [].

Ответы [ 4 ]

16 голосов
/ 31 марта 2011

object[,] относится к прямоугольному массиву, что означает, что это сетка.
Тогда у вас есть object[][], который является зубчатым массивом, массивом массивов.

Основное отличие состоит в том, что object[,] всегда будет иметь фиксированные размеры, в то время как с помощью зубчатого массива (object[][]) все массивы могут иметь разные размеры.

Это пример, который четко показывает разницу в использовании (оба делают то же самое):

// Create and fill the rectangluar array
int[,] rectangularArray = new int[10, 20];
for (int i = 0; i < 200; i++)
    rectangularArray[i / 20, i % 20] = i;

// Next line is an error:
// int[][] jaggedArray = new int[10][20];
int[][] jaggedArray = new int[10][]; // Initialize it

// Fill the jagged array
for (int i = 0; i < 200; i++)
{
    if (i % 20 == 0)
        jaggedArray[i / 20] = new int[20]; // This size doesn't have to be fixed
    jaggedArray[i / 20][i % 20] = i;
}

// Print all items in the rectangular array
foreach (int i in rectangularArray)
    Console.WriteLine(i);

// Print all items in the jagged array
// foreach (int i in jaggedArray) <-- Error
foreach (int[] innerArray in jaggedArray)
    foreach (int i in innerArray)
        Console.WriteLine(i);

РЕДАКТИРОВАТЬ:
Внимание, этот код выше не реальный производственный код, это просто самый простой способ сделать это в качестве примера.
Интенсивное использование делений через/ и % делают это намного медленнее.Вы могли бы лучше использовать вложенный цикл.

4 голосов
/ 31 марта 2011

В C # существует два разных типа «многомерных массивов».

T[,] - это многомерный массив .T[][] представляет собой зубчатый массив .

Основное различие заключается в том, как они хранятся.Многомерные массивы хранятся в виде единого непрерывного фрагмента памяти.Зубчатые массивы фактически являются массивом массивов.Таким образом, многомерным массивам требуется только одно выделение, и каждый «ряд» и «столбец» будут иметь одинаковый размер (они всегда IxJ).

В зубчатом массиве все «вторые» элементы массива могут иметь разную длину, поскольку они являются отдельными массивами.Он хранит массив ссылок, каждая из которых может указывать на отдельный массив элементов.

При этом, вопреки распространенным ожиданиям, зубчатые массивы, даже если они занимают больше памяти (для хранения дополнительных ссылок на массив) и не хранятся непрерывно в памяти, часто работают лучше, чем многомерные массивы из-за некоторых оптимизаций в CLR.

3 голосов
/ 31 марта 2011

object[,] относится к массиву объектов с двумя измерениями.

В общем случае двухмерные массивы можно рассматривать как таблицы, в которых одно измерение представляет столбцы, а другой индекс представляет строки.

int[,] numbers = new int[3, 2] { {1, 2}, {3, 4}, {5, 6} };

    0  1
   ------
0 | 1  2
1 | 3  4
2 | 4  6

Ознакомьтесь с разделом о многомерных массивах здесь:
http://msdn.microsoft.com/en-us/library/aa288453(VS.71).aspx

2 голосов
/ 31 марта 2011

Это матрица или двумерный массив. Документ MSDN здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...