您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 第3章-集合、索引器与泛型
1.NET程序设计杨剑yang_jian03@126.com2C#程序设计语言第一章:.NET与C#概述第二章:面向对象程序设计第三章:集合、索引器与泛型第四章:程序调试与异常处理第五章:基于事件驱动的程序设计第六章:Windows程序设计技术第七章:C#数据库编程技术第八章:文件操作与编程技术第九章:多线程和异步编程第三章集合、索引器与泛型4本章目标了解.NET类库中的集合类,初步掌握常用集合的创建和操作方法理解索引器的概念,能区别索引器与属性,掌握索引器的定义与使用了解泛型的相关概念,初步掌握泛型接口、泛型类、泛型属性和泛型方法的使用5索引器[访问修饰符]数据类型this[数据类型标识符]{get{};set{};}语法索引器(indexer)是一种属性,它允许以数组的方式索引对象6定义和调用索引器4-1classPhoto{string_title;publicPhoto(stringtitle){this._title=title;}publicstringTitle{get{return_title;}}}Photo以Title属性表示照片Album将照片存放于数组photos中classAlbum{//该数组用于存放照片Photo[]photos;publicAlbum(intcapacity){photos=newPhoto[capacity];}75.3.4/5.2.1定义和调用索引器4-2publicPhotothis[intindex]{get{//验证索引范围if(index0||index=photos.Length){Console.WriteLine(索引无效);returnnull;//使用null指示失败}returnphotos[index];//对于有效索引,返回请求的照片}set{if(index0||index=photos.Length){Console.WriteLine(索引无效);return;}photos[index]=value;}}带有int参数的Photo索引器读/写索引器8定义和调用索引器4-3publicPhotothis[stringtitle]{get{//遍历数组中的所有照片foreach(Photopinphotos){//将照片中的标题与索引器参数进行比较if(p.Title==title)returnp;}Console.WriteLine(未找到);//使用null指示失败returnnull;}}带有string参数的Photo索引器只读索引器9定义和调用索引器4-4staticvoidMain(string[]args){Albumfriends=newAlbum(3);//创建一个容量为3的相册Photofirst=newPhoto(Jenn);//创建3张照片Photosecond=newPhoto(Smith);Photothird=newPhoto(Mark);friends[0]=first;//向相册加载照片friends[1]=second;friends[2]=third;Photoobj1Photo=friends[2];//按索引检索Console.WriteLine(obj1Photo.Title);Photoobj2Photo=friends[Jenn];//按名称检索Console.WriteLine(obj2Photo.Title);}10数组的局限string[]Students=newstring[3]{张三,李四,王五};如果每个班级的人数不固定班级中来了一个新的学员班级人员的数组调整大小困难增加元素困难能否动态的维护一个集合?重新定义数组相同类型和名称变量的集合11System.Collections简介ID工作档案ID工作档案ID工作档案ID工作档案职员1职员2职员3职员4Employee对象的集合对象组中元素个数未知,并且随时可能要循环、添加和移除12ArrayList是一个可动态维护长度的集合可维护动态长度的集合新增元素可删除元素可访问单个元素objectobjectobjectobject0123索引(下标)object40123ArrayList自动调整索引通过索引访问13ArrayList的初始化usingSystem.Collections;…ArrayListStudents=newArrayList();ArrayListTeachers=newArrayList(5)可以指定长度引入命名空间实例化一个对象常见错误未引入命名空间定义时未实例化引入System.Collections命名空间实例化ArrayList对象14ArrayList添加元素intAdd(Objectvalue)//添加一个对象到集合的末尾ArrayListstudents=newArrayList();Studentscofield=newStudent(Scofield,Genders.Male,28,越狱狱);…students.Add(scofield);创建学员对象添加学员连续添加三个学员对象并获取集合元素的数目返回索引ArrayList.Count获取元素数目建立班级学员的集合15访问ArrayList元素(类型)ArrayList[index]//按指定索引(下标)取得对象Studentstu1=(Student)students[0];stu1.SayHi();…按索引取值转换为学员对象ArrayList第一个对象的索引是0需要类型转换16删除ArrayList的元素ArrayList.Remove(对象名)//删除指定对象名的对象ArrayList.RemoveAt(index)//删除指定索引的对象ArrayList.Clear()//清除集合内的所有元素students.RemoveAt(0);students.Remove(zhang);Studentleave=(Student)students[0];leave.SayHi();通过索引删除对象通过指定对象删除只剩一个对象剩余的元素会自动调整索引取得删除后的第一个对象17ArrayList的遍历//遍历foreach(Objectstuoinstudents){StudentstuForeach=(Student)stuo;Console.WriteLine(stuForeach.Name);}通过对象遍历打印对象的Name属性Scofield张靓靓周杰杰可以使用和数组类似的方式for(inti=0;istudents.Count;i++){StudentstuFor=(Student)students[i];Console.WriteLine(stuFor.Name);}foreach方式输出结果类型转换18常见错误1//…students.Add(scofield);students.Add(zhang);students.Add(jay);students.RemoveAt(0);students.RemoveAt(1);students.RemoveAt(2);运行这段代码会发生错误?索引会自动调整删除两个元素后,不再有索引“2“19常见错误2Studentscofield=newStudent(Scofield,Genders.Male,28,越狱狱);…Studentstu2=newStudent(Scofield,Genders.Male,28,越狱狱);//打印集合数目…students.Remove(stu2);//打印集合数目…如果Remove(stu2),能否删除scofield对象?定义一个对象与前面的值相同20ArrayList通过索引获取对象为什么使用HashTable能否象索引器那样通过关键字获取该对象呢?动态可维护长度可通过关键字检索C#提供一种集合HashTableStudents[周杰杰].SayHi();Studentstu1=(Student)Students[0];索引器通过关键字获取对象21什么是HashTableArrayList每个元素对应一个索引HashTable通常称为哈希表根据键(Key)可以查找到相应的值(Value)objectobjectobjectobjectobject0123…ArrayList索引KeyValueKeyValueKeyValueKeyValueKeyValueHashTable值键键和值一一对应22使用哈希表students.Add(scofield.Name,scofield);添加元素KeyValue…Studentstu2=(Student)students[周杰杰];stu2.SayHi();…通过key获取元素students.Remove(周杰杰);…通过key删除元素给哈希表添加元素获取哈希表的元素删除哈希表的元素需要类型转换23哈希表的遍历foreach(Objectstuoinstudents.Values){Studentstu=(Student)stuo;Console.WriteLine(stu.Name);}如何遍历一个哈希表?KeyValueKeyValueKeyValueKeyValueKeyValueValues不能遍历整个对象,而是遍历Valuesforeach(stringnameinstudents.Keys){Console.WriteLine(name);}可以遍历Keys24类型安全1MySchool中添加一个Teacher类Teacherjacky=newTeacher(成龙龙,4);jacky.SayHi();students.Add(jacky);能否加入一个Teacher对象?foreach(Objectstuoinstudents){Studentstu=(Student)stuo;Console.WriteLine(stu.Name);}遍历这个集合是否有问题?25类型安全2Student集合Scofield张靓靓周杰杰成龙龙添加对象遍历集合对象存储不易控制类型转换容易出错Teacher对象运行错误26引入命名空间:System.Collections.GenericListStudentstudents=newListStudent();利用ListStudent存储班级集合ListT的使用students.Add(scofield);…students.Add(jacky);将Student对象加入班级将Teacher对象加入班级编译出错foreach(Studentstuinstudents){Console.WriteLine(stu.Name);}不需类型转换遍历ListStudent集合只能保存Student对象27什么是泛型集合泛型最常见的用途是创建集合类泛型集合可以约束集合内的元素类型典型泛型集合ListT,DictionaryK,VT、K,V表示该泛型集合中的元素类型ListStudentStudent对象Teacher对象允许添加不允许添加Student对象无需转换类型28使用泛型集合ListTStudentstu1=students[2];stu1.SayHi();Students.RemoveAt(0);//ListStudent方式foreach(Studentstuinstudents){Console.WriteLine(stu.Name);}ListT的访问方式与ArrayList相同使用索引访问,无需类型转换利用索引删除遍历时不需要类型转换29ListT与ArrayList通过索引删除元素添加对象方法相同通过索引访问集合的元素相同点需要装箱拆箱无需装箱拆箱可以增加任何类型增加元素时类型严格检查不同点ArrayListListT异同
本文标题:第3章-集合、索引器与泛型
链接地址:https://www.777doc.com/doc-4711265 .html