所以我从一个旧的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 [] []这样的符号来处理的。
答案 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 Array。 T[][]
是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