资源描述
单击此处编辑母版文本样式,第二级,第三级,第四级,单击此处编辑母版标题样式,使用集合组织相关数据,第,六,章,回顾与作业点评,什么是封装?如何实现封装?,类的公有和私有成员在类图中如何表现?,class Test,static void Main(string args),Student stus=new Student2new Student(),new Student();,stus0.Age=10;stus0.Name=,张靓,;,stus1.Age=19;stus1.Name=,小新,;,int num=0;,Test.ChangeAge(stus,num);,public static void ChangeAge(Student stu,int num),for(int i=0;i stu.Length;i+),if(stui.Age 15),stui.Age=15;,num+;,说出调用方法后,,num,以及学生的姓名和年龄,num,:,0,张靓:,15,小新:,19,预习检查,ArrayList,中如何添加数据?,定义泛型集合时的特殊语法符号?,本章任务,实现员工信息管理,实现员工考勤管理,理解集合的概念,熟练使用集合访问数据,理解泛型的概念,熟练使用各种泛型集合,本章目标,数组的局限性,SE,engineers,=new,SE,3,;,engineers0=new SE();,engineers1=new SE();,如果每个部门的人数不固定,部门中来了一个新同事,调整大小困难,增加元素困难,能否动态的维护一个集合?,重新定义数组,3,个工程师对象组成的集合,数组长度定义很大,ArrayList,是一个可动态维护长度的集合,可维护动态长度的集合,新增元素,可删除元素,可访问单个元素,object,object,object,object,0,1,2,3,索引,(,下标,),object,4,0,1,2,3,ArrayList,自动调整索引,通过索引访问,ArrayList,的初始化,using System.Collections;,ArrayList,engineers,=new ArrayList();,ArrayList engineers=new ArrayList(5),可以指定长度,引入命名空间,实例化一个对象,常见错误,未引入命名空间,定义时未实例化,引入,System.Collections,命名空间,实例化,ArrayList,对象,ArrayList,添加元素,int,Add,(,Object value,),/,添加一个对象到集合的末尾,ArrayList engineers=new ArrayList();,SE,jack,=new SE();,jack,.Name=,王小毛,;,engineers.,Add,(jack);,创建工程师对象,添加对象到集合,连续添加三个工程师对象,并获取集合元素的数目,返回索引,engineers.Count,获取元素数目,建立部门工程师集合,演示示例:向集合添加元素,访问,ArrayList,元素,(,类型,),ArrayList,index,/,按指定索引(下标)取得对象,SE engineer=,(SE),engineers0;,MessageBox.Show(engineer.SayHi();,按索引取值,转换为工程师对象,需要类型转换,获取集合元素,并执行问好,演示示例:访问集合元素,ArrayList,的遍历,foreach(,Object obj,in,engineers),SE seForeach=(SE),obj,;,Console.WriteLine(seForeach.Name);,通过对象遍历,王小毛,周,新雨,张,烨,可以使用和数组类似的方式,for(int i=0;i engineers.Count;i+),SE seFor=(SE)engineersi;,Console.WriteLine(seFor.Name);,foreach,方式,类型转换,演示示例:遍历集合元素,删除,ArrayList,的元素,ArrayList.,Remove,(,对象名,)/,删除指定对象名的对象,ArrayList.,RemoveAt,(,index,)/,删除指定索引的对象,ArrayList.,Clear,()/,清除集合内的所有元素,engineers.RemoveAt(0);,engineers.Remove(ema);,MessageBox.Show(string.Format(,部门共包括,0,个工程师。,engineers.Count.ToString();,SE leave=(SE)engineers0;,MessageBox.Show(leave.SayHi();,通过索引删除元素,剩余的元素会自动调整索引,通过指定对象删除元素,常见错误,2-1,/,/,添加元素,engineers.Add(,jack,);,engineers.Add(,joe,);,engineers.Add(,ema,);,/,删除元素,engineers.RemoveAt(0);,engineers.RemoveAt(1);,engineers.RemoveAt(2);,运行这段代码会发生错误?,演示示例:常见错误,1,索引会自动调整,删除两个元素后,不再有索引“,2”,常见错误,2-2,/,定义三个,SE,对象(省略),SE se2=new SE();,se2.Name=,王小毛,;,se2.Age=26;,engineers.Add(se2);,engineers.Remove(se2);,/打印集合数目,定义一个对象与前面定义的,jack,对象属性值相同,Remove(se2),,能否删除,jack,对象?,演示示例:常见错误,2,小结,学生类,Student,已定义,属性为:,Name,、,Age,使用,ArrayList,存储学生集合,添加两个学生(周杰伦,,22,;杨伊,,21,),使用,for,和,foreach,遍历学生信息,参考答案,ArrayList,通过索引获取对象,为什么使用哈希表,是否能够通过关键字获取该对象呢?,动态可维护长度,可通过关键字检索,C#,提供另一种集合,集合:,Hashtable,SE engineer=(SE),engineers0;,ArrayList,中元素频繁变化,跟踪元素下标很困难,什么是,HashTable,ArrayList,每个元素对应一个索引,Hashtable,通常称为哈希表,根据键(,Key,)可以查找到相应的值(,Value,),object,object,object,object,object,0,1,2,3,ArrayList,索引,Key,Value,Key,Value,Key,Value,Key,Value,Key,Value,Hashtable,值,键,键和值一一对应,使用哈希表,Hashtable,engineers=,new,Hashtable();,engineers.Add(,jack.ID,jack);,添加元素,Key,Value,SE se2=(SE)engineers,000,;,se2.SayHi();,通过,key,获取元素,s,engineers.Remove(000);,通过,key,删除元素,给哈希表添加元素,获取哈希表的元素,删除哈希表的元素,需要类型转换,演示示例:哈希表操作,哈希表的遍历,foreach(Object obj in engineers.Values),SE se=(SE)obj;,Console.WriteLine(se.Name);,如何遍历一个,哈希表?,Key,Value,Key,Value,Key,Value,Key,Value,Key,Value,Values,不能遍历整个对象,而是遍历,Values,foreach(Object obj in engineers.Keys),Console.WriteLine(string)obj);,可以遍历,Keys,小结,删除一个,ArrayList,元素有几种方法?,Hashtable,和,ArrayList,的主要区别是什么?,类型安全,2-1,PM pm=new PM();,pm.Name=,盖茨,;,pm.Id=8230;,engineers.Add(jack);,engineers.Add(joe);,engineers.Add(ema);,engineers.Add(pm);/,添加一个项目经理对象,能否加入一个,PM,对象?,foreach(Object obj in engineers),SE engineer=(SE)obj;,MessageBox.Show(engineer.SayHi();,遍历这个集合是否有问题?,考虑出现的问题,演示示例:类型安全,类型安全,2-2,SE,集合,王小毛,周新雨,张烨,盖茨,添加对象,遍历集合,转换为,SE,对象,对象存储不易控制,类型转换容易出错,!,PM,对象,运行错误,使用,List,加强类型安全,使用,List,List,engineers=new,List(),;,engineers.Add(jack);,engineers.Add(joe);,engineers.Add(ema);,engineers.Add(pm);/,添加一个项目经理对象,将,SE,对象加入工程师集合,编译出错,泛型集合,演示示例:泛型集合,List,保证类型安全,什么是泛型集合,泛型,最常见的用途是创建集合类,泛型集合可以约束集合内的元素类型,典型泛型集合,List,,,Dictionary,、,表示该泛型集合中的元素类型,List,SE,对象,PM,对象,允许添加,不允许添加,SE,对象,无需转换类型,使用,List,泛型集合,命名空间:,System.Collections.Generic,创建,List,泛型集合,遍历,List,engineers=new,List(),;,foreach(,SE,se in engineers),MessageBox.Show(,se.SayHi(),);,只能保存,SE,对象,无需类型转换,演示示例:泛型集合,List,操作,VS 2010,自动引入,List,的访问方式与,ArrayList,类似,List,与,ArrayList,访问,List,与,ArrayList,的对比,是否有哈希表那样存储,Key,和,Value,形式的泛型集合呢?,异同点,List,ArrayList,不同点,增加元素时类型严格检查,可以增加任何类型,添加和读取值类型元素时,无需装箱拆箱,添加和读取值类型元素时,需要装箱拆箱,相同点,通过索引访问集合的元素,添加对象方法相同,通过索引删除元素,Dictionary,概述,Dictionary,通常称为字典,约束集合中元素类型,编译时检查类型约束,无需装箱拆箱操作,与哈希表操作类似,Dictionary,的使用,engineers.Add(jack.ID,jack);,SE engineer=engineers000;,engineers.Remove(000);,添加一对,Key/Value,通过,Key,获取元素,通过,Key,删除元素,/Dictionary 方式,foreach(,SE,se in,engineers.Values,),MessageBox.Show(se.SayHi();,遍历,Values,演示示例:泛型集合,Dictionary,操作,Dictionary engineers,=new Dictionary();,Key,存储,String,类型,Value,存储,SE,类型,利用,Dictionary,存储工程师列表,Dictionary,与哈希表,访问,Dictionary,与 哈希表 的对比,异同点,Dicti
展开阅读全文