
《使用数组和集合》PPT课件.ppt
36页院级精品课程院级精品课程面向对象程序设计面向对象程序设计面向对象程序设计面向对象程序设计安徽机电职业技术学院信息工程系安徽机电职业技术学院信息工程系汪学文汪学文(wxwOOP@)2013年年10月月( ( ( (使用使用使用使用VS 2010VS 2010VS 2010VS 2010和和和和C#)C#)C#)C#)8 使用数组和集合使用数组和集合8 使用数组和集合使用数组和集合q数组数组是一种自定义类型,是是一种自定义类型,是引用类型引用类型q数组是一个数组是一个无序无序的的元素序列元素序列§数组中的所有元素都具有数组中的所有元素都具有相同的类型相同的类型§数组中的元素存储在连续的内存块中,使用数组中的元素存储在连续的内存块中,使用整数的索引整数的索引来访来访问q本课主要介绍以下内容:本课主要介绍以下内容:§定义和初始化数组定义和初始化数组§访问数组和数组元素访问数组和数组元素§认识数组作为方法的参数的作用认识数组作为方法的参数的作用§理解参数数组理解参数数组§了解一些常用集合类的使用了解一些常用集合类的使用28.1 声明数组变量声明数组变量qC#中,可以创建一维数组中,可以创建一维数组type[] arrayName;int[] array1;?int[] array2 = new int[5];@int[] array3 = new int[]{{1,3,5,7,9};@@int[] array4 = {{1,2,,3,,4,,5,,6};栈栈堆堆示例代码位于示例代码位于“Lesson7\UseArray”38.1 声明数组变量声明数组变量qC#中,还可以创建多维数组中,还可以创建多维数组type[,] arrayName;int[,] array5 = new int[2,3];@int[] array6 = {{1,2,3},{4,5,6}};@栈栈堆堆示例代码位于示例代码位于“Lesson7\UseArray”48.1 声明数组变量声明数组变量qC#中,还可以创建交错数组中,还可以创建交错数组(数组的数组数组的数组)type[][] arrayName;int[][] array7 = new int[6][];array[7][1] = new int[4]{1,2,3,4};array[7][2] = {1,3,5,7,9};@栈栈堆堆示例代码位于示例代码位于“Lesson7\UseArray”58.1 声明数组变量声明数组变量q数组是对象,使用时要用数组是对象,使用时要用newnew进行实例化进行实例化q允许创建大小为允许创建大小为0 0的数组。
的数组q数组可以是一维、多维或交错的数组可以是一维、多维或交错的q数值数组元素的默认值设置为零,而引用元素的默认数值数组元素的默认值设置为零,而引用元素的默认值设置为值设置为 nullq交错数组是数组的数组,因此其元素是引用类型并初交错数组是数组的数组,因此其元素是引用类型并初始化为始化为 nullq数组的索引从零开始:具有数组的索引从零开始:具有 n 个元素的数组的索引是个元素的数组的索引是从从 0 到到 n-1q数组元素可以是任何类型,包括数组类型数组元素可以是任何类型,包括数组类型68.2 访问数组成员访问数组成员q初始化数组初始化数组q访问数组成员访问数组成员q大括号中的值不都是常数,可以是在运行时通过运算而得大括号中的值不都是常数,可以是在运行时通过运算而得到的值:到的值:int[] numbers = new int[5]{10, 9, 8, 7, 6};numbers[4] = 5; string[] animal = {"Mouse", "Cat", "Lion"}; animal[1]= "Elephant";string someAnimal = animal[2];Random r = new Random();int[] pins = new int[4] {r.Next()%100,r.Next()%100, r.Next()%100,r.Next()%100};示例代码位于示例代码位于“Lesson7\UseArray”78.2.1 遍历整个数组遍历整个数组q使用使用 forfor语句可以遍历所有数组元素语句可以遍历所有数组元素int[] numbers = {4, 5, 6, 1, 2, 3, -2, -1, 0}; for (int i = 0; i < numbers.Length; i++ ) { Console.WriteLine(numbers[i]);}示例代码位于示例代码位于“Lesson7\UseArray”88.2.2 遍历整个数组遍历整个数组q使用使用 foreachforeach 语句为数组中的每一个元素反复执行嵌语句为数组中的每一个元素反复执行嵌入的代码入的代码int[] numbers = {4, 5, 6, 1, 2, 3, -2, -1, 0}; foreach (int i in numbers) { Console.WriteLine(i);}示例代码位于示例代码位于“Lesson7\UseArray”98.2.3 for与与foreach的比较的比较qforeach语句总是遍历整个数组。
如果只需要遍历数组语句总是遍历整个数组如果只需要遍历数组的特定部分(如前半部分),或者绕过特定元素(如的特定部分(如前半部分),或者绕过特定元素(如只遍历索引为偶数的元素),最好是使用只遍历索引为偶数的元素),最好是使用for语句qforeach语句总是从索引语句总是从索引0遍历到索引遍历到索引Length-1,,如果如果需要反向遍历,那么最好是使用需要反向遍历,那么最好是使用for语句q如果循环体需要知道元素索引,而不仅仅是元素值,如果循环体需要知道元素索引,而不仅仅是元素值,那么必须使用那么必须使用for语句q如果需要修改数组元素,那么必须使用如果需要修改数组元素,那么必须使用for语句,因为语句,因为foreach语句的循环变量是一个只读变量语句的循环变量是一个只读变量108.2.4 数组的有关属性数组的有关属性q数组的属性:数组的属性:§LengthLength:数组包含多少个元素:数组包含多少个元素q数组的方法:数组的方法:§CloneClone:获取与源数组一模一样的数组:获取与源数组一模一样的数组§CopyToCopyTo:将源数组拷贝到目标数组的指定位置:将源数组拷贝到目标数组的指定位置qArrayArray类的方法:类的方法:§SortSort:排序:排序§ReverseReverse:反转:反转118.2.5 理解深拷贝与浅拷贝理解深拷贝与浅拷贝q阅读教材阅读教材P176P176关于关于““复制数组复制数组””一节一节q如果数组元素是引用类型,进行数组元素复制时,只如果数组元素是引用类型,进行数组元素复制时,只复制对象的引用,不会为新数组对象分配新的内存空复制对象的引用,不会为新数组对象分配新的内存空间。
这称为间这称为““浅拷贝浅拷贝””参考示例代码位于参考示例代码位于“Lesson8\UseArray”中的中的Step 4这里定义了一个这里定义了一个Person数组,而数组,而Person是一个对象是一个对象128.3 认识集合认识集合q数组的大小是固定的如果要扩容,需要重新使用数组的大小是固定的如果要扩容,需要重新使用new来分配来分配内存空间内存空间q有时,还有其它一些要求,如:有时,还有其它一些要求,如:§先进先出,先进先出,FIFO,即队列,即队列§后进先出,后进先出,LIFO,即栈,即栈§按键值查找,即字典功能按键值查找,即字典功能§有序有序q教材教材P184~192介绍了以下集合类型,请自动阅读介绍了以下集合类型,请自动阅读§ArrayList,顺序表,顺序表§Queue,队列,队列§Stack,栈,栈§HashTable,哈希表,实现字典功能,哈希表,实现字典功能§SortedList,有序表,有序表138.3.1 示例:宾馆住宿程序示例:宾馆住宿程序q主要学习使用集合类对象,将数据绑定到主要学习使用集合类对象,将数据绑定到comboBox控控件件§了解数据绑定了解数据绑定§熟悉熟悉List
省去了原来的许多判断178.4 数组作为方法的参数数组作为方法的参数q为演示数组作方法的参数,我们来编写一组方法为演示数组作方法的参数,我们来编写一组方法q方法方法1 1:将数组内容转换为字符串:将数组内容转换为字符串§方法名:方法名:ArrayToStringArrayToString§功能:将数组内容转换为字符串功能:将数组内容转换为字符串§参数:参数:intint[] array[] array§返回值:返回值:string, string, 表示数组内容的字符串表示数组内容的字符串示例代码位于示例代码位于“Lesson7\ArraySample”188.4.1 ArrayToString方法方法private string ArrayToString(int[] array){ // 如果如果array为空,或者为空,或者array中无元素,返回空串中无元素,返回空串 if (array == null) return String.Empty; if (array.Length <= 0) return String.Empty; string s = String.Format("{0}", array[0]); for (int i=1; i 过来的不确定个数的一组数据q方法方法3 3:求一组数的和:求一组数的和§方法名:方法名:SumSum§功能:求一组整数的和功能:求一组整数的和§参数:参数:paramsparams intint[] array[] array§返回值:返回值:intint, , 这组数的和这组数的和 private void button2_Click(object sender, EventArgs e){ int total = Sum(11, 12, 13, 14, 15 ,16 ,17); Output(String.Format("这组数的和是:这组数的和是:{0}", total));}示例代码位于示例代码位于“Lesson7\ArraySample”22Sum方法方法private int Sum(params int[] array){ int sum = 0; foreach (int i in array) { sum += i; } return sum;}示例代码位于示例代码位于“Lesson7\ArraySample”238.4.4 比较参数数组和可选参数比较参数数组和可选参数q教材教材3.43.4节介绍了可选参数和命名参数节介绍了可选参数和命名参数q可以通过以下形式调用可以通过以下形式调用private int Sum(int a=0, int b=0, int c=0, int d=0){ return a + b + c + d;}示例代码位于示例代码位于“Lesson7\ArraySample”total = Sum(11,12); // 结果是结果是23total = Sum(11,12,13); // 结果是结果是36total = Sum(11,12,13,14); // 结果是结果是50total = Sum(a:12,d:30); // 结果是结果是42248.4.4 比较参数数组和可选参数比较参数数组和可选参数q如果同时有参数数组和可选参数的两个如果同时有参数数组和可选参数的两个SumSum方法,下面方法,下面的语句,会调用哪个方法?的语句,会调用哪个方法?private int Sum(params int[] array){ ……}private int Sum(int a=0, int b=0, int c=0, int d=0){ ……}total = Sum(11,12,13); // 结果是结果是36最佳匹配原则:优先选用可选参数最佳匹配原则:优先选用可选参数258.4.5 参数的按引用传递参数的按引用传递q方法方法3 3:计算一组数的和与平均值:计算一组数的和与平均值§方法名:方法名:SumSum§功能:求一组整数的和功能:求一组整数的和§参数:参数:paramsparams intint[] array[] array§返回值:返回值:intint, , 这组数的和这组数的和方法的返回值只能计算一个值,方法的返回值只能计算一个值,要计算要计算2个,只能通过参数返个,只能通过参数返回回26另一个另一个Sum方法方法private void Sum(int sum, double aver, params int[] array){ sum = 0; aver = 0.0; foreach (int i in array) { sum += i; } if (array.Length>0) aver = (double)sum/array.Length;}这样计算可以吗?这样计算可以吗?示例代码位于示例代码位于“Lesson7\ArraySample”27另一个另一个Sum方法方法private void button3_Click(object sender, EventArgs e){ Output("计算一组数计算一组数11,12,13,14,15,16,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));}因为方法参数默认是按值进因为方法参数默认是按值进行传递的。 行传递的能不能够像指针一样,使用能不能够像指针一样,使用按地址传递呢?按地址传递呢?示例代码位于示例代码位于“Lesson7\ArraySample”28使用使用ref关键字关键字private void Sum(ref int sum, ref double aver, params int[] array){ sum = 0; aver = 0.0; foreach (int i in array) { sum += i; } if (array.Length>0) aver = (double)sum/array.Length;}参数列表中使用参数列表中使用ref关键字,编译器就知道相应变量的数值将关键字,编译器就知道相应变量的数值将通过引用来传递调用方法时,也必须对实参使用通过引用来传递调用方法时,也必须对实参使用ref关键字关键字示例代码位于示例代码位于“Lesson7\ArraySample”29使用使用ref关键字关键字private void button3_Click(object 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关键字关键字示例代码位于示例代码位于“Lesson7\ArraySample”308.4.6 编写第编写第4个方法:个方法:GenerateArrayq方法方法4 4:给数组元素赋随机值:给数组元素赋随机值§方法名:方法名:GenerateArrayGenerateArray§功能:逐个给数组中的每个元素赋随机值功能:逐个给数组中的每个元素赋随机值§参数:参数:intint[] array[] array§返回值:无返回值:无private void button1_Click(object sender, EventArgs e){ int[] number = new int[10]; GenerateArrayGenerateArray(number); Output("数组中的数为:数组中的数为:"); Output(ArrayToString(number)); Output(String.Format("这组数的和是:这组数的和是:{0}", ArraySum(number)));}示例代码位于示例代码位于“Lesson7\ArraySample”31GenerateArray方法方法private void GenerateArray(int[] array){ Random r = new Random(); for (int i = 0; i < array.Length; i++) { array[i] = r.Next(0, 100); }}因为数组变量本身是引用类因为数组变量本身是引用类型,所以型,所以GenerateArray方法可以改变方法可以改变array数组元数组元素的值素的值示例代码位于示例代码位于“Lesson7\ArraySample”32另一个另一个GenerateArray方法方法q方法方法5 5:给数组元素赋随机值:给数组元素赋随机值§方法名:方法名:GenerateArrayGenerateArray§功能:对数组功能:对数组arrayarray初始化,并对每个元素赋随机值初始化,并对每个元素赋随机值§参数:参数:intint[] array, [] array, intint count( count(表示要多少个数表示要多少个数) )§返回值:无返回值:无private void button1_Click(object sender, EventArgs e){ int[] number; GenerateArrayGenerateArray(number, 10); Output("数组中的数为:数组中的数为:"); Output(ArrayToString(number)); Output(String.Format("这组数的和是:这组数的和是:{0}", ArraySum(number)));}这儿说明,对数组初始化要这儿说明,对数组初始化要在在GenerateArray方法内方法内部进行部进行示例代码位于示例代码位于“Lesson7\ArraySample”33另一个另一个GenerateArray方法方法private void GenerateArray(int[] array, int count){ array = new int[count]; Random r = new Random(); for (int i = 0; i < array.Length; i++) { array[i] = r.Next(0, 100); }}编译时出错。 编译时出错使用使用ref关键字说明参数关键字说明参数array,编译时也会出错编译时也会出错使用使用out关键字关键字示例代码位于示例代码位于“Lesson7\ArraySample”34out关键字关键字q由于由于C#C#强制性要求明确赋值,即所有参数变量在传递强制性要求明确赋值,即所有参数变量在传递给方法前必须经过了初始化赋值这样可以避免由于给方法前必须经过了初始化赋值这样可以避免由于使用未赋值变量而导致的常见错误使用未赋值变量而导致的常见错误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。












