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,是可以的,如

System.Console.WriteLine("Enter number of rows : ");
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
如:

System.Console.WriteLine("Enter number of rows: ");
string s1 = System.Console.ReadLine( );
int rows = int.Parse(s1);

int[,] matrix = new int[rows,4];

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

string s = System.Console.ReadLine( );
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[] row=new long[4];
long[] copy=row;

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

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

所以Value=1。

Array Property:


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

int[ ] one = new int[1];
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,

one.Length = 1
two.Length
= 1 * 2
three.Length
= 1 * 2 * 3


Array Methods:


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

int[ ] data = {4,6,3,8,9,3}; // Unsorted
System.Array.Sort(data); // Now sorted


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

int[ ] data = {4,6,3,8,9,3};
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[,] data = { {0, 1, 2, 3}, {4, 5, 6, 7} };
int dim0 = data.GetLength(0); // == 2
int dim1 = data.GetLength(1); // == 4


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

int[ ] data = {4,6,3,8,9,3};
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

posted on 2005-04-19 17:25  Pierce  阅读(1640)  评论(2编辑  收藏  举报

导航