Что означает object [,] в c#?

поэтому я наткнулся на какой-то мой код из старого проекта 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 ответов


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

EDIT:
Внимание, этот код выше не настоящий производственный код, это просто самый ясный способ сделать это в качестве примера.
Интенсивное использование подразделений через / и % делает его гораздо медленнее. Вы могли бы лучше использовать вложенный цикл for.


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

T[,] Это Многомерный Массив. T[][] это многомерном массиве.

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

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

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


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

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

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


это матрица или двухмерный массив.MSDN doc здесь