《使用数组和集合.ppt》由会员分享,可在线阅读,更多相关《使用数组和集合.ppt(36页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、院级精品课程院级精品课程面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计安徽机电职业技术学院信息工程系安徽机电职业技术学院信息工程系汪学文汪学文(wxwOOP)2013年年10月月(使用使用使用使用VS 2010VS 2010VS 2010VS 2010和和和和C#)C#)C#)C#)8 使用数组和集合使用数组和集合8 使用数组和集合使用数组和集合q数组数组是一种自定义类型,是是一种自定义类型,是引用类型引用类型。q数组是一个数组是一个无序无序的的元素序列元素序列。数组中的所有元素都具有数组中的所有元素都具有相同的类型相同的类型数组中的元素存储在连续的内存块中,使用数组中的元素
2、存储在连续的内存块中,使用整数的索引整数的索引来访来访问。问。q本课主要介绍以下内容:本课主要介绍以下内容:定义和初始化数组定义和初始化数组访问数组和数组元素访问数组和数组元素认识数组作为方法的参数的作用认识数组作为方法的参数的作用理解参数数组理解参数数组了解一些常用集合类的使用了解一些常用集合类的使用28.1 声明数组变量声明数组变量qC#中,可以创建一维数组中,可以创建一维数组type arrayName;int array1;?int array2=new int5;int array3 =new int1,3,5,7,9;int array4 =1,2,3,4,5,6;栈栈堆堆示例代码
3、位于示例代码位于“Lesson7UseArray”38.1 声明数组变量声明数组变量qC#中,还可以创建多维数组中,还可以创建多维数组type,arrayName;int,array5 =new int2,3;int array6 =1,2,3,4,5,6;栈栈堆堆示例代码位于示例代码位于“Lesson7UseArray”48.1 声明数组变量声明数组变量qC#中,还可以创建交错数组中,还可以创建交错数组(数组的数组数组的数组)type arrayName;int array7 =new int6;array71 =new int41,2,3,4;array72 =1,3,5,7,9;栈栈堆堆
4、示例代码位于示例代码位于“Lesson7UseArray”58.1 声明数组变量声明数组变量q数组是对象,使用时要用数组是对象,使用时要用newnew进行实例化进行实例化q允许创建大小为允许创建大小为0 0的数组。的数组。q数组可以是一维、多维或交错的。数组可以是一维、多维或交错的。q数值数组元素的默认值设置为零,而引用元素的默认数值数组元素的默认值设置为零,而引用元素的默认值设置为值设置为 null。q交错数组是数组的数组,因此其元素是引用类型并初交错数组是数组的数组,因此其元素是引用类型并初始化为始化为 null。q数组的索引从零开始:具有数组的索引从零开始:具有 n 个元素的数组的索引是
5、个元素的数组的索引是从从 0 到到 n-1。q数组元素可以是任何类型,包括数组类型。数组元素可以是任何类型,包括数组类型。68.2 访问数组成员访问数组成员q初始化数组初始化数组q访问数组成员访问数组成员q大括号中的值不都是常数,可以是在运行时通过运算而得大括号中的值不都是常数,可以是在运行时通过运算而得到的值:到的值:int numbers=new int510,9,8,7,6;numbers4=5;string animal=Mouse,Cat,Lion;animal1=Elephant;string someAnimal=animal2;Random r=new Random();int
6、 pins=new int4 r.Next()%100,r.Next()%100,r.Next()%100,r.Next()%100;示例代码位于示例代码位于“Lesson7UseArray”78.2.1 遍历整个数组遍历整个数组q使用使用 for for语句可以遍历所有数组元素语句可以遍历所有数组元素int numbers=4,5,6,1,2,3,-2,-1,0;for(int i=0;i numbers.Length;i+)Console.WriteLine(numbersi);示例代码位于示例代码位于“Lesson7UseArray”88.2.2 遍历整个数组遍历整个数组q使用使用 fo
7、reach foreach 语句为数组中的每一个元素反复执行嵌语句为数组中的每一个元素反复执行嵌入的代码入的代码int numbers=4,5,6,1,2,3,-2,-1,0;foreach(int i in numbers)Console.WriteLine(i);示例代码位于示例代码位于“Lesson7UseArray”98.2.3 for与与foreach的比较的比较qforeach语句总是遍历整个数组。如果只需要遍历数组语句总是遍历整个数组。如果只需要遍历数组的特定部分(如前半部分),或者绕过特定元素(如的特定部分(如前半部分),或者绕过特定元素(如只遍历索引为偶数的元素),最好是使用
8、只遍历索引为偶数的元素),最好是使用for语句。语句。qforeach语句总是从索引语句总是从索引0遍历到索引遍历到索引Length-1,如果,如果需要反向遍历,那么最好是使用需要反向遍历,那么最好是使用for语句。语句。q如果循环体需要知道元素索引,而不仅仅是元素值,如果循环体需要知道元素索引,而不仅仅是元素值,那么必须使用那么必须使用for语句。语句。q如果需要修改数组元素,那么必须使用如果需要修改数组元素,那么必须使用for语句,因为语句,因为foreach语句的循环变量是一个只读变量。语句的循环变量是一个只读变量。108.2.4 数组的有关属性数组的有关属性q数组的属性:数组的属性:L
9、engthLength:数组包含多少个元素:数组包含多少个元素q数组的方法:数组的方法:CloneClone:获取与源数组一模一样的数组:获取与源数组一模一样的数组CopyToCopyTo:将源数组拷贝到目标数组的指定位置:将源数组拷贝到目标数组的指定位置qArrayArray类的方法:类的方法:SortSort:排序:排序ReverseReverse:反转:反转118.2.5 理解深拷贝与浅拷贝理解深拷贝与浅拷贝q阅读教材阅读教材P176P176关于关于“复制数组复制数组”一节一节q如果数组元素是引用类型,进行数组元素复制时,只如果数组元素是引用类型,进行数组元素复制时,只复制对象的引用,不
10、会为新数组对象分配新的内存空复制对象的引用,不会为新数组对象分配新的内存空间。这称为间。这称为“浅拷贝浅拷贝”参考示例代码位于参考示例代码位于“Lesson8UseArray”中的中的Step 4这里定义了一个这里定义了一个Person数组,而数组,而Person是一个对象是一个对象128.3 认识集合认识集合q数组的大小是固定的。如果要扩容,需要重新使用数组的大小是固定的。如果要扩容,需要重新使用new来分配来分配内存空间。内存空间。q有时,还有其它一些要求,如:有时,还有其它一些要求,如:先进先出,先进先出,FIFO,即队列,即队列后进先出,后进先出,LIFO,即栈,即栈按键值查找,即字典
11、功能按键值查找,即字典功能有序有序q教材教材P184192介绍了以下集合类型,请自动阅读介绍了以下集合类型,请自动阅读ArrayList,顺序表,顺序表Queue,队列,队列Stack,栈,栈HashTable,哈希表,实现字典功能,哈希表,实现字典功能SortedList,有序表,有序表138.3.1 示例:宾馆住宿程序示例:宾馆住宿程序q主要学习使用集合类对象,将数据绑定到主要学习使用集合类对象,将数据绑定到comboBox控控件件了解数据绑定了解数据绑定熟悉熟悉List类型的使用类型的使用148.3.1.1 定义定义Room类类RoomType属性将对应下拉列表控制显示的名称属性将对应下
12、拉列表控制显示的名称Price字段,用于选取下拉列表时,获取对应的值字段,用于选取下拉列表时,获取对应的值158.3.2 声明列表对象并初始化声明列表对象并初始化指定数据源指定数据源指定显示字段指定显示字段指定值字段指定值字段也可以使用也可以使用ArrayList,但,但效率不高效率不高168.3.3 计算计算数据绑定后,可以使用数据绑定后,可以使用SelectedValue属性获取选择项的值,属性获取选择项的值,省去了原来的许多判断。省去了原来的许多判断。178.4 数组作为方法的参数数组作为方法的参数q为演示数组作方法的参数,我们来编写一组方法为演示数组作方法的参数,我们来编写一组方法q方
13、法方法1 1:将数组内容转换为字符串:将数组内容转换为字符串方法名:方法名:ArrayToStringArrayToString功能:将数组内容转换为字符串功能:将数组内容转换为字符串参数:参数:int arrayint array返回值:返回值:string,string,表示数组内容的字符串表示数组内容的字符串示例代码位于示例代码位于“Lesson7ArraySample”188.4.1 ArrayToString方法方法private string ArrayToString(int array)/如果如果array为空,或者为空,或者array中无元素,返回空串中无元素,返回空串 if
14、(array=null)return String.Empty;if(array.Length=0)return String.Empty;string s=String.Format(0,array0);for(int i=1;i0)aver =(double)sum/array.Length;这样计算可以吗?这样计算可以吗?示例代码位于示例代码位于“Lesson7ArraySample”27另一个另一个Sum方法方法private void button3_Click(object sender,EventArgs e)Output(计算一组数计算一组数11,12,13,14,15,16,
15、17和与平均值:和与平均值:);int sum=0;double average=0.0;Sum(sum,average,11,12,13,14,15,16,17);Output(String.Format(这组数的和是这组数的和是0,平均值是平均值是1,sum,average);因为方法参数默认是按值进因为方法参数默认是按值进行传递的。行传递的。能不能够像指针一样,使用能不能够像指针一样,使用按地址传递呢?按地址传递呢?示例代码位于示例代码位于“Lesson7ArraySample”28使用使用ref关键字关键字private void Sum(ref int sum,ref double
16、aver,params int array)sum=0;aver=0.0;foreach(int i in array)sum+=i;if(array.Length0)aver =(double)sum/array.Length;参数列表中使用参数列表中使用ref关键字,编译器就知道相应变量的数值将关键字,编译器就知道相应变量的数值将通过引用来传递。调用方法时,也必须对实参使用通过引用来传递。调用方法时,也必须对实参使用ref关键字关键字示例代码位于示例代码位于“Lesson7ArraySample”29使用使用ref关键字关键字private void button3_Click(objec
17、t sender,EventArgs e)Output(计算一组数计算一组数11,12,13,14,15,16,17和与平均值:和与平均值:);int sum=0;double average=0.0;Sum(ref sum,ref average,11,12,13,14,15,16,17);Output(String.Format(这组数的和是这组数的和是0,平均值是平均值是1,sum,average);调用时也须使用调用时也须使用ref关键字关键字示例代码位于示例代码位于“Lesson7ArraySample”308.4.6 编写第编写第4个方法:个方法:GenerateArrayq方法方
18、法4 4:给数组元素赋随机值:给数组元素赋随机值方法名:方法名:GenerateArrayGenerateArray功能:逐个给数组中的每个元素赋随机值功能:逐个给数组中的每个元素赋随机值参数:参数:int arrayint array返回值:无返回值:无private void button1_Click(object sender,EventArgs e)int number=new int10;GenerateArrayGenerateArray(number);Output(数组中的数为:数组中的数为:);Output(ArrayToString(number);Output(Stri
19、ng.Format(这组数的和是:这组数的和是:0,ArraySum(number);示例代码位于示例代码位于“Lesson7ArraySample”31GenerateArray方法方法private void GenerateArray(int array)Random r=new Random();for(int i=0;i array.Length;i+)arrayi=r.Next(0,100);因为数组变量本身是引用类因为数组变量本身是引用类型,所以型,所以GenerateArray方法可以改变方法可以改变array数组元数组元素的值素的值示例代码位于示例代码位于“Lesson7Ar
20、raySample”32另一个另一个GenerateArray方法方法q方法方法5 5:给数组元素赋随机值:给数组元素赋随机值方法名:方法名:GenerateArrayGenerateArray功能:对数组功能:对数组arrayarray初始化,并对每个元素赋随机值初始化,并对每个元素赋随机值参数:参数:int array,int count(int array,int count(表示要多少个数表示要多少个数)返回值:无返回值:无private void button1_Click(object sender,EventArgs e)int number;GenerateArrayGener
21、ateArray(number,10);Output(数组中的数为:数组中的数为:);Output(ArrayToString(number);Output(String.Format(这组数的和是:这组数的和是:0,ArraySum(number);这儿说明,对数组初始化要这儿说明,对数组初始化要在在GenerateArray方法内方法内部进行部进行示例代码位于示例代码位于“Lesson7ArraySample”33另一个另一个GenerateArray方法方法private void GenerateArray(int array,int count)array=new intcount;
22、Random r=new Random();for(int i=0;i array.Length;i+)arrayi=r.Next(0,100);编译时出错。编译时出错。使用使用ref关键字说明参数关键字说明参数array,编译时也会出错。,编译时也会出错。使用使用out关键字关键字示例代码位于示例代码位于“Lesson7ArraySample”34out关键字关键字q由于由于C#C#强制性要求明确赋值,即所有参数变量在传递强制性要求明确赋值,即所有参数变量在传递给方法前必须经过了初始化赋值。这样可以避免由于给方法前必须经过了初始化赋值。这样可以避免由于使用未赋值变量而导致的常见错误。使用未赋
23、值变量而导致的常见错误。q通过使用关键字通过使用关键字outout,可以避免多余的初始化,可以避免多余的初始化q当需要通知编译器将在方法内部进行变量初始化时,当需要通知编译器将在方法内部进行变量初始化时,就应使用关键字就应使用关键字outout,从而可以把未初始化的变量传递,从而可以把未初始化的变量传递给方法。给方法。int number;GenerateArrayGenerateArray(out number,10);private void GenerateArray(out int array,int count)358.6 本课小结本课小结q本课主要介绍数组的声明、初始化及使用本课主要介绍数组的声明、初始化及使用q数组是引用类型,通过数组是引用类型,通过new来初始化来初始化q可以使用可以使用foreach循环遍历数组循环遍历数组q了解数组作为方法参数的作用与值类型的不同了解数组作为方法参数的作用与值类型的不同q掌握方法参数数组掌握方法参数数组(params)与方法的可选参数的作用与方法的可选参数的作用与异同与异同q进一步掌握引用参数进一步掌握引用参数(ref)和输出参数和输出参数(out)的作用的作用q了解集合类的使用了解集合类的使用q初步熟悉数据绑定的使用初步熟悉数据绑定的使用36
限制150内