什么是Array?
Love Array,Understand Array
注意:
      Structs可以是不同类型的数据的集合,Array只能是相同类型的,所以Array的速度更快,Structs可以使用复杂的数据。
     Arrays是连续的数据集合,所以可以使用连续的Integer访问,也可以随机的访问,因为存放在连续的内存空间,所以速度很快的。

ArrayRank:
Love Array,Understand Array
Rank:如果用空间表示,可以说是一种多维走向,像是地图的坐标一样标示数据。
最常用的int[] matrix=new int[5];   可以称为1维数组,
             int[,] matrix=new int[5,5];   可以成为2维数组
随着[]内的“,”的增多,Rank也随意增多。
想要访问Array中的数据?用过地图吗?
Love Array,Understand Array
是不是同地图一样简单,或者更加简单。
注意:一般情况下数组的元素标号从0开始,对于单维或者多维Array都是这样的。特殊状况下,可以定义并使用Array,它的元素开始标示是1。

Array的Bounds:使用Array,当然要确定Bounds
Love Array,Understand Array
使用GetLength()方法,可以确定特定Rank的长度,使用Length,那么获得的是所有的Array的Length,即Length=Rank1*rank1Leng+Rank2+rank2Length....

比较Array和Collections:这是很多人感到Confuse的吧
Love Array,Understand Array
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.
Love Array,Understand Array

如:
   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的值
Love Array,Understand Array
  
使用“{”,“}”,“,”可以初始化Array的Element,执行顺序从左到右。
   对于multidimensional Array,每个Element都要赋值。
Love Array,Understand Array

建立Computed Size Array
Love Array,Understand Array
建立multidimensional Array时,通过使用run-time expressions 来定义each dimention的length,是可以的,如

Love Array,Understand ArraySystem.Console.WriteLine("Enter number of rows : ");
Love Array,Understand Array
string s1 = System.Console.ReadLine( );
Love Array,Understand Array
int rows = int.Parse(s1);
Love Array,Understand ArraySystem.Console.WriteLine(
"Enter number of columns: ");
Love Array,Understand Array
string s2 = System.Console.ReadLine( );
Love Array,Understand Array
int cols = int.Parse(s2);
Love Array,Understand ArrayLove Array,Understand Array
Love Array,Understand Array
int[,] matrix = new int[rows,cols];


同样,可以使用compile-time constants 和run-time expression来混合定义Array
如:

Love Array,Understand ArraySystem.Console.WriteLine("Enter number of rows: ");
Love Array,Understand Array
string s1 = System.Console.ReadLine( );
Love Array,Understand Array
int rows = int.Parse(s1);
Love Array,Understand ArrayLove Array,Understand Array
Love Array,Understand Array
int[,] matrix = new int[rows,4];

但是也有限制,那就是不能够使用run-time expression定义Array的同时,给Array的Element初始化,如

Love Array,Understand Arraystring s = System.Console.ReadLine( );
Love Array,Understand Array
int size = int.Parse(s);
Not allowed


Copy Array Variables:

Love Array,Understand Array
Copy Array 时,Copy的只是Variable,不是instance,即2个Array Variable都指向同一块内存,

    对于
  

Love Array,Understand Arraylong[] row=new long[4];
Love Array,Understand Array
long[] copy=row;

只是2个Array Variable都指向了相同的内存区域,
对于

Love Array,Understand Arrayrow[0]++; //Array Instance的第一个Element++
Love Array,Understand Array
int Value=copy[0];//将ArrayInstance的第一个Element赋值给Value
Love Array,Understand Array
Console.WriteLine(Value);//输出变量

所以Value=1。

Array Property:
Love Array,Understand Array

Rand Property 是一个只读的Integer value,用来描述Array的dimension,

Love Array,Understand Arrayint[ ] one = new int[1];
Love Array,Understand Array
int[,] two = new int[1,2];
Love Array,Understand Array
int[,,] three = new int[1,2,3];
Love Array,Understand Array
//the resulting rank values are as follows:
Love Array,Understand Array
one.Rank = 1
Love Array,Understand Arraytwo.Rank
= 2
Love Array,Understand Arraythree.Rank
= 3

而Length 也是只读的integer value,用来描述Array的总的Length,

Love Array,Understand Arrayone.Length = 1
Love Array,Understand Arraytwo.Length
= 1 * 2
Love Array,Understand Arraythree.Length
= 1 * 2 * 3


Array Methods:

Love Array,Understand Array
Sort Method:
   使用Sort(),对于支持IComparable的Structure和Class同样使用

Now sorted


Clear Method:
   Clear(),可以将Array的一定Arrange的Element设为0(value type) 或者null(refrence type);

, data.Length);


Clone Method:
  Clone() 根据源Array的instance的各个Element,建立新的Array Instance ,这样修改Clone() 后的Array,不影响源Array。

对于以上蓝色字体部分的Clone(),存在于Array的实例方法中,不属于static方法。

GetLength Method:
  GetLength()可以获取特定dimension的Length。

== 4


IndexOf Method:
  IndexOf()只能在one dimension Array中使用,用来返回第一个符合条件的Element的位置

== 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

相关文章: