对象[,]在c#中意味着什么?

时间:2011-03-31 17:57:12

标签: c# arrays excel matrix vsto

所以我从一个旧的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 个答案:

答案 0 :(得分:16)

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

修改
警告,上面的代码不是真正的生产代码,它只是最明智的方式。例如 通过/%大量使用分区会使速度变慢。你最好使用嵌套的for循环。

答案 1 :(得分:4)

C#中有两种不同类型的“多维数组”。

T[,]Multidimensional ArrayT[][]jagged array

主要区别在于它们的存储方式。多维数组存储为单个连续的内存块。锯齿状数组实际上是一个数组数组。因此,多维数组只需要一个分配,每个“行”和“列”将具有相同的大小(它们总是IxJ)。

在锯齿状数组中,“第二”数组元素都可以是不同的长度,因为它们是单独的数组。它存储了一组引用,每个引用都可以指向一个单独的元素数组。

正如所说的那样,与常见的期望相反,即使它们占用更多内存(存储额外的数组引用)并且没有连续存储在内存中,由于CLR中的一些优化,它们通常比多维数组执行得更好。

答案 2 :(得分:3)

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

答案 3 :(得分:2)

它是一个矩阵或二维数组。MSDN doc here