在C#中,object[,]代表一个二维数组。

7

我发现了一些来自旧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

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循环。


@Paul Sasik 谢谢,我添加了一些有关它们使用的示例。 - Aidiakapi
1
@aidiakapi +1 针对这个例子并且详细解释。太棒了! - Michael

4
在C#中有两种不同类型的“多维数组”。 T[,]多维数组T[][]是一个锯齿数组
主要区别在于它们的存储方式。多维数组存储为单个连续的内存块。锯齿数组实际上是一个数组的数组。因此,多维数组只需要单个分配,每个“行”和“列”的大小都相同(它们始终是IxJ)。
在锯齿数组中,“第二”数组元素的长度可以是不同的,因为它们是单独的数组。它存储了一组引用的数组,每个引用都可以指向一个单独的元素数组。
尽管锯齿数组需要更多的内存(以存储额外的数组引用)并且未按顺序存储在内存中,但与多维数组相比,由于CLR中的一些优化,它们通常表现更好。

@"Reed Copsey" +1 感谢提供链接和简明扼要的解释。这绝对激发了我的数学思维! - Michael

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


2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接