Love Array,Understand Array
什么是Array?
注意:
Structs可以是不同类型的数据的集合,Array只能是相同类型的,所以Array的速度更快,Structs可以使用复杂的数据。
Arrays是连续的数据集合,所以可以使用连续的Integer访问,也可以随机的访问,因为存放在连续的内存空间,所以速度很快的。
ArrayRank:
Rank:如果用空间表示,可以说是一种多维走向,像是地图的坐标一样标示数据。
最常用的int[] matrix=new int[5]; 可以称为1维数组,
int[,] matrix=new int[5,5]; 可以成为2维数组
随着[]内的“,”的增多,Rank也随意增多。
想要访问Array中的数据?用过地图吗?
是不是同地图一样简单,或者更加简单。
注意:一般情况下数组的元素标号从0开始,对于单维或者多维Array都是这样的。特殊状况下,可以定义并使用Array,它的元素开始标示是1。
Array的Bounds:使用Array,当然要确定Bounds
使用GetLength()方法,可以确定特定Rank的长度,使用Length,那么获得的是所有的Array的Length,即Length=Rank1*rank1Leng+Rank2+rank2Length....
比较Array和Collections:这是很多人感到Confuse的吧
Array建立时,它的Size和类型就固定了,不可以更改的。如建立int[] matrix=new int[5];
那么matrix的长度就是5,一维的,能够存储的数据类型只能是int.
Collections却可以存储复杂的数据类型,而且可以任意增加或者删除存储的数据。
建立Array 的instance 不可以是Const的,
const int[] matrix={1,2,3}; //不可以的,
但是
readonly int[] matrix={1,2,3};//可以,但是matrix的元素都是 只读的,
想 matrix[0]++; //会出错的
当定义Array时使用readonly,那么readonly 将影响Array variable自己(matrix) ,而不是Array Instance的Element(matrix[0],matrix[1]),即不能够将它指向其他的Array instance,
realonly int[] matrix={4,2};
matrix=new int[2]{4,2}; //不可以的
当然也可以建立只读的Arraylist
ArrayList al=new ArrayList(9);
ArrayList alReadonly=ArrayList.ReadOnly(al);
alReadonly[3]=22; // 不可以的
建立Array Instance
因为Array是引用类型的,所以声明instance时需要使用new ,同时,要声明所有的Rank的值。声明Array的instance 后,编译器会给Array Instance的每个元素根据元素类型赋值,如int的为0,bool的为false.
如:
long[] matrix=new long[4];
执行时,等价于
long[] matrix=new long[4];
long[0]=0L;
long[1]=0L;
long[2]=0L;
long[3]=0L;
同时,编译器会把Array放入连续的内存中,不论Array是何种类型或者长度是多长,如果建立了一个new int[2,3,4],这个Array 有2*3*4个Element,它们都会在同一块连续的内存中。
初始化Array中Element的值
使用“{”,“}”,“,”可以初始化Array的Element,执行顺序从左到右。
对于multidimensional Array,每个Element都要赋值。
建立Computed Size Array
建立multidimensional Array时,通过使用run-time expressions 来定义each dimention的length,是可以的,如
string s1 = System.Console.ReadLine( );
int rows = int.Parse(s1);
System.Console.WriteLine("Enter number of columns: ");
string s2 = System.Console.ReadLine( );
int cols = int.Parse(s2);
int[,] matrix = new int[rows,cols];
同样,可以使用compile-time constants 和run-time expression来混合定义Array
如:
string s1 = System.Console.ReadLine( );
int rows = int.Parse(s1);
int[,] matrix = new int[rows,4];
但是也有限制,那就是不能够使用run-time expression定义Array的同时,给Array的Element初始化,如
int size = int.Parse(s);
int[ ] data = new int[size]{0,1,2,3}; // Not allowed
Copy Array Variables:
Copy Array 时,Copy的只是Variable,不是instance,即2个Array Variable都指向同一块内存,
对于
long[] copy=row;
只是2个Array Variable都指向了相同的内存区域,
对于
int Value=copy[0];//将ArrayInstance的第一个Element赋值给Value
Console.WriteLine(Value);//输出变量
所以Value=1。
Array Property:
Rand Property 是一个只读的Integer value,用来描述Array的dimension,
int[,] two = new int[1,2];
int[,,] three = new int[1,2,3];
//the resulting rank values are as follows:
one.Rank = 1
two.Rank = 2
three.Rank = 3
而Length 也是只读的integer value,用来描述Array的总的Length,
two.Length = 1 * 2
three.Length = 1 * 2 * 3
Array Methods:
Sort Method:
使用Sort(),对于支持IComparable的Structure和Class同样使用
System.Array.Sort(data); // Now sorted
Clear Method:
Clear(),可以将Array的一定Arrange的Element设为0(value type) 或者null(refrence type);
System.Array.Clear(data, 0, data.Length);
Clone Method:
Clone() 根据源Array的instance的各个Element,建立新的Array Instance ,这样修改Clone() 后的Array,不影响源Array。
对于以上蓝色字体部分的Clone(),存在于Array的实例方法中,不属于static方法。
GetLength Method:
GetLength()可以获取特定dimension的Length。
int dim0 = data.GetLength(0); // == 2
int dim1 = data.GetLength(1); // == 4
IndexOf Method:
IndexOf()只能在one dimension Array中使用,用来返回第一个符合条件的Element的位置
int where = System.Array.IndexOf(data, 9); // == 4
注意:对于特定的Array的类型,根据需要或许要重写Equal() ,才可以使用IndexOf方法,比如建立的是复杂的stucture Array,那么需要重写Equal()告诉编译器,怎样去Compare。
除此以外,还有Reverse()--反转,LastIndexOf()--最后一次配置的索引等有用的方法。
原著写的更好,我只是做了摘录,大家有兴趣的话,一定要看原著。
参考:
Microsoft Msdn Training 2001
Introduction to C# Programming
for the Microsoft® .NET Platform
(Prerelease)
Work Book
Course Number: 2124A