日期:2014-05-18  浏览次数:21071 次

两个数组的区别
C# code

int count = 10;
int[][] a = new int[count][count];// 报错
int[,] b = new int[count,count];// 不报错


请高人解释下,基础语法很重要啊....

------解决方案--------------------
你可以向微软提出要求,当你写new int[count][count]的时候,帮你创建一个整齐的交错数组。

也建议你搜索什么是"交错数组"。
------解决方案--------------------
是交错数组。
------解决方案--------------------
没有这种写法,你要创造,当然不对
------解决方案--------------------
首先C#中二维数组的定义是通过int[,] b = new int[count,count]实现,定义了一个count行count列的数组。
int[][] a,这种形式是一种类似不确定列的数组结构。
int [][] a = new int[10][];//定义一个10容纳十个元素的对象啊,每个元素是int[],其中元素个数不确定。
a[0][] = new int[10];//a的第一个位置是可容纳10个int的一维数组
a[1][] = new int[50];//a的第一个位置是可容纳50个int的一维数组
a[2][] = new int [5];//a的第一个位置是可容纳5个int的一维数组
...
------解决方案--------------------
交错数组
------解决方案--------------------
int[][] a = new int[count][count];// 报错
=>
int[][] a = new int[count][];
for (int i = 0; i < a.Length; i++)
{
a[i] = new int[count];
}
------解决方案--------------------
探讨

谢谢各位老师,交错数组我晓得了。
我感觉报错是正常的,数组中不能用变量去定义,在C中是严格的。
但第二句:int[,] b = new int[count,count];// 不报错
为什么不报错呢?
还是没明白,比较笨,还请多多深点。

------解决方案--------------------
简单地说,C语言中定义一个数组,那么编译器会静态的为你分配空间。

如果不给出常数,C编译器怎么知道分配多少呢?

而C#不管分配空间,那是运行时CLR干的事情。
------解决方案--------------------
探讨

引用:

谢谢各位老师,交错数组我晓得了。
我感觉报错是正常的,数组中不能用变量去定义,在C中是严格的。
但第二句:int[,] b = new int[count,count];// 不报错
为什么不报错呢?
还是没明白,比较笨,还请多多深点。

C#定义二维数组语法就这样

------解决方案--------------------
#region 多维数组(矩形数组) 和数组的数组(jagged array,锯齿数组)
/*多维数组:每一行的元素的个数都是相同的*/
double[,] hillHeight = new double[3, 4] { { 1, 2, 3, 4 }, { 2, 3, 4, 5 }, { 3, 4, 5, 6 } }; 

//得到多维数组中的值
foreach (double height in hillHeight)
{
Console.WriteLine("{0}",height);
}

/*锯齿数组:每行都有不同的元素个数。每一个元素都是另一个数组。也可以由数组的数组的数组*/
int[][] jaggedIntArray;//声明锯齿数组
int[][] jaggedIntArray2;
// jaggedIntArray = new int[3][4];//不能这样声明锯齿数组
// jaggedIntArray = {{1,2,3},{1},{1,2}};//不能这样初始化锯齿数组
/*方式一:*/
jaggedIntArray = new int[2][];
jaggedIntArray[0] = new int[3];
jaggedIntArray[1] = new int[4];

/*方式二:*/
jaggedIntArray2 = new int[3][] { new int[]{1,2,3},new int[]{1,2},new int[]{4}};
//jaggedIntArray2 = { new int[]{1,2,3},new int[]{1,2},new int[]{4}};

foreach(var s in jaggedIntArray2)
{
Console.WriteLine(s);//得不到其值
}

//嵌套循环才可以得到锯齿数组的值
foreach(int[] s4 in jaggedIntArray2)
{
foreach(int s in s4)
{
Console.WriteLine(s);
}
}

/*锯齿数组的语法很复杂,大多数情况下,使用矩形数组比较简单,这是一种比较简单的存储方式。但是,有时必须使用锯齿数组,且工作效率并不会因此而降低*/
Console.ReadLine();