1、如何使用集合和泛型集合如何使用集合和泛型集合数组的局限数组的局限string Students = new string3 张三张三, 李四李四, 王五王五;如果每个班级的人数不固定如果每个班级的人数不固定 班级中来了一个新的学员班级中来了一个新的学员 班级人员的数组班级人员的数组 调整大小困难调整大小困难增加元素困难增加元素困难v 能否动态的维护一个集合?能否动态的维护一个集合?重新定义数组重新定义数组 相同类型和名称相同类型和名称变量的集合变量的集合v ArrayList是一个可动态维护长度的集合是一个可动态维护长度的集合可维护动态长度的集合可维护动态长度的集合新增元素新增元素 可删除元素
2、可删除元素 可访问单个元素可访问单个元素 objectobjectobjectobject0123索引索引(下标下标)object40123ArrayList自动调整自动调整索引索引通过索引通过索引访问访问ArrayList的初始化的初始化using System.Collections;/ArrayList Students = new ArrayList();ArrayList Teachers = new ArrayList(5);可以指定长度可以指定长度引入命名空间引入命名空间实例化一个对象实例化一个对象常见错误常见错误未引入命名空间未引入命名空间定义时未实例化定义时未实例化v 引入引
3、入System.Collections命名空间命名空间v 实例化实例化ArrayList对象对象ArrayList添加元素添加元素int Add(Object value) /添加一个对象到集合的末尾添加一个对象到集合的末尾ArrayList students = new ArrayList();Student scofield = new Student(Scofield, Genders.Male, 28, 越狱狱越狱狱);/students.Add(scofield);创建学员对象创建学员对象添加学员添加学员连续添加三个学员对象连续添加三个学员对象并获取集合元素的数目并获取集合元素的数目
4、返回索引返回索引ArrayList.Count获获取元素数目取元素数目v 建立班级学员的集合建立班级学员的集合演示示例演示示例1 1:MySchool 访问访问ArrayList元素元素(类型类型) ArrayListindex /按指定索引(下标)取得对象按指定索引(下标)取得对象Student stu1 = (Student)students0;stu1.SayHi();按索引取值按索引取值转换为学员对象转换为学员对象ArrayList第一个对第一个对象的索引是象的索引是0需要类型转换需要类型转换删除删除ArrayList的元素的元素ArrayList.Remove(对象名对象名) /删除
5、指定对象名的对象删除指定对象名的对象ArrayList.RemoveAt(index) /删除指定索引的对象删除指定索引的对象ArrayList.Clear() /清除集合内的所有元素清除集合内的所有元素students.RemoveAt(0);students.Remove(zhang);Student leave = (Student)students0;leave.SayHi();通过索引删除对象通过索引删除对象通过指定对象删除通过指定对象删除只剩一个对象只剩一个对象剩余的元素会自动调整索引剩余的元素会自动调整索引取得删除后的第一个对象取得删除后的第一个对象ArrayList 的遍历的遍
6、历/遍历遍历foreach (Object stuo in students) Student stuForeach = (Student)stuo; Console.WriteLine(stuForeach.Name);通过对象遍历通过对象遍历打印对象的打印对象的Name属性属性Scofield张靓靓张靓靓周杰杰周杰杰v 可以使用和数组类似的方式可以使用和数组类似的方式for (int i = 0; i students.Count; i+) Student stuFor = (Student)studentsi; Console.WriteLine(stuFor.Name);v forea
7、ch 方式方式输出结果输出结果类型转换类型转换演示示例演示示例2 2:MySchool v ArrayList通过索引获取对象通过索引获取对象为什么使用为什么使用HashTable能否像索引器那样通过关键字获取该对象呢?能否像索引器那样通过关键字获取该对象呢?动态可维护长度动态可维护长度可通过关键字检索可通过关键字检索C#提供一种集合提供一种集合HashTable Students周杰杰周杰杰.SayHi();Student stu1 = (Student)Students0; v 通过关键字获取对象通过关键字获取对象什么是什么是HashTablev ArrayList 每个元素对应一个索引每
8、个元素对应一个索引v HashTable 通常称为哈希表通常称为哈希表v 根据键(根据键(Key)可以查找到相应的值()可以查找到相应的值(Value)objectobjectobjectobjectobject0123ArrayList索引索引KeyValueKeyValueKeyValueKeyValueKeyValueHashTable值值键键键和值一一对应键和值一一对应使用哈希表使用哈希表students.Add(scofield.Name , scofield);添加元素添加元素KeyValueStudent stu2 = (Student)students周杰杰周杰杰;stu2.S
9、ayHi();通过通过key获取元素获取元素students.Remove(周杰杰周杰杰);通过通过key删除元素删除元素v 给哈希表添加元素给哈希表添加元素v 获取哈希表的元素获取哈希表的元素v 删除哈希表的元素删除哈希表的元素需要类型转换需要类型转换演示示例演示示例5 5:MySchool 哈希表的遍历哈希表的遍历foreach (Object stuo in students.Values) Student stu = (Student)stuo; Console.WriteLine(stu.Name);如何遍历一个如何遍历一个哈希表?哈希表?KeyValueKeyValueKeyVal
10、ueKeyValueKeyValueValues不能遍历整个对象,而不能遍历整个对象,而是遍历是遍历Valuesforeach (string name in students.Keys) Console.WriteLine(name);可以遍历可以遍历Keys类型安全类型安全1MySchool中添加一个中添加一个Teacher类类Teacher jacky = new Teacher(“周星驰周星驰, 4);jacky.SayHi(); students.Add(jacky);能否加入一个能否加入一个Teacher对象?对象?foreach (Object stuo in students)
11、 Student stu = (Student)stuo; Console.WriteLine(stu.Name);遍历这个集合是否遍历这个集合是否有问题?有问题?类型安全类型安全2Student集合集合Scofield张靓靓张靓靓周杰杰周杰杰成龙龙成龙龙添加对象添加对象遍历集合遍历集合对象存储不对象存储不易控制易控制类型转换类型转换容易出错容易出错Teacher对象对象运行错误运行错误v 引入命名空间:引入命名空间:System.Collections.Genericv List students = new List();v 利用利用List存储班级集合存储班级集合List的使用的使用st
12、udents.Add(scofield);students.Add(jacky);将将Student对象加入班级对象加入班级将将Teacher对象加入班级对象加入班级编译出错编译出错foreach (Student stu in students) Console.WriteLine(stu.Name);不需类型转换不需类型转换 遍历遍历List集合集合只能保存只能保存Student对象对象什么是泛型集合什么是泛型集合v 泛型最常见的用途是创建集合类泛型最常见的用途是创建集合类v 泛型集合可以约束集合内的元素类型泛型集合可以约束集合内的元素类型 v 典型泛型集合典型泛型集合List,Dicti
13、onary 、表示该泛型集合中的元素类型表示该泛型集合中的元素类型ListStudent对象对象Teacher对象对象允许添加允许添加不允许添加不允许添加Student对象对象无需转换类型无需转换类型 使用泛型集合使用泛型集合ListStudent stu1 = students2;stu1.SayHi();Students.RemoveAt(0);/List 方式方式foreach (Student stu in students) Console.WriteLine(stu.Name);List的访问方式与的访问方式与ArrayList相同相同使用索引访问,无需类型转换使用索引访问,无需类
14、型转换利用索引删除利用索引删除遍历时不需要类型转换遍历时不需要类型转换 List 与与 ArrayList通过索引删除元素通过索引删除元素添加对象方法相同添加对象方法相同通过索引访问集合的元素通过索引访问集合的元素相同点相同点需要装箱拆箱需要装箱拆箱无需装箱拆箱无需装箱拆箱可以增加任何类型可以增加任何类型增加元素时类型严格检查增加元素时类型严格检查不同点不同点ArrayListList异同点异同点是否有是否有哈希表哈希表那样存储那样存储Key和和Value形式的泛型集合呢?形式的泛型集合呢? v 访问访问 List 与与 ArrayList 的对比的对比Dictionary概述概述v Dict
15、ionary具有具有List相同的特性相同的特性 约束集合中元素类型约束集合中元素类型 编译时检查类型约束编译时检查类型约束 无需装箱拆箱操作无需装箱拆箱操作v 与哈希表类似存储与哈希表类似存储Key和和Value的集合的集合Dictionary students = new Dictionary();利用利用Dictionary存储学员集合存储学员集合Key存储存储String类型类型value存储存储Student类型类型Dictionary的使用的使用students.Add(scofield.Name, scofield);student stu2 = students周杰杰周杰杰;s
16、tudents.Remove(周杰杰周杰杰);添加一对添加一对Key/Value通过通过Key获取元素获取元素通过通过Key删除元素删除元素 /Dictionary 方式方式foreach (Student student in students.Values) Console.WriteLine(student.Name);遍历遍历ValuesDictionary的访问方式与哈希表相同的访问方式与哈希表相同Dictionary与哈希表与哈希表遍历方法相同遍历方法相同添加对象方法相同添加对象方法相同通过通过Key获取获取Value相同点相同点需要装箱拆箱需要装箱拆箱无需装箱拆箱无需装箱拆箱可以
17、增加任何类型可以增加任何类型增加元素时类型严格检查增加元素时类型严格检查不同点不同点哈希表哈希表Dictionary异同点异同点v 访问访问 Dictionary 与与 哈希表哈希表 的对比的对比泛型的重要性泛型的重要性v 泛型集合与传统集合相比类型更安全泛型集合与传统集合相比类型更安全 泛型集合无需装箱拆箱操作泛型集合无需装箱拆箱操作v 泛型的重要性泛型的重要性 泛型是未来五年的主流技术之一泛型是未来五年的主流技术之一 解决了很多需要繁琐操作的问题解决了很多需要繁琐操作的问题 提供了更好的类型安全性提供了更好的类型安全性 CLR 支持泛型支持泛型 后续课程学习泛型接口后续课程学习泛型接口上机练习上机练习v 使用使用List的流程和步骤的流程和步骤 添加元素添加元素 存取单个元素存取单个元素 删除元素删除元素 遍历元素遍历元素v 使用使用DictionaryK,V)的流程和步骤的流程和步骤 定义定义Dictionary泛型集合泛型集合 获取泛型集合的元素获取泛型集合的元素 删除泛型集合的一个元素删除泛型集合的一个元素 遍历泛型集合的元素遍历泛型集合的元素谢谢大家!谢谢大家!