如何使用泛型与泛型集合
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
liststudent方式foreachstudentstu的访问方式与相同listt的访问方式与arraylist相同使用索引访问无需类型转换使用索引访问无需类型转换利用索引删除利用索引删除遍历时不需要类型转换遍历时不需要类型转换listtarraylist通过索引删除元素添加对象方法相同通过索引访问集合的元素相同点需要装箱拆箱无需装箱拆箱可以增加任何类型增加元素时类型严格检查不同点arraylistlistt异同点是否有哈希表那样存储key和value形式的泛型集合呢
students.Remove("周杰杰"); 通过key删除元素 …
演示示例5:MySchool
哈希表的遍历
如何遍历一个哈希表?
不能遍历整个对象,而 是遍历Values
foreach (Object stuo in students.Values) {
Student stu = (Student)stuo; Console.WriteLine(); }
给哈希表添加元素
使用哈希表
students.Add( , scofield);
添加元素
Key
获取哈希表的元素
Value
…
Student stu2 = (Student)students["周杰杰"];
stu2.SayHi();
…
需要类型转换
通过key获取元素
删除哈希表的元素
int Add(Object value) //添加一个对象到集合的末尾 返回索引
建立班级学员的集合
ArrayList students = new ArrayList();
Student scofield = new Student("Scofield", Genders.Male, 28, "越狱狱");
Teacher jacky = new Teacher(“周星驰", 4); jacky.SayHi(); students.Add(jacky); 能否加入一个
Teacher对象?
foreach (Object stuo in students) {
Student stu = (Student)stuo; Console.WriteLine(); } 遍历这个集合是否 有问题?
通过Key获取Value 添加对象方法相同
遍历方法相同
泛型的重要性
泛型集合与传统集合相比类型更安全
泛型集合无需装箱拆箱操作
泛型的重要性
泛型是未来五年的主流技术之一 解决了很多需要繁琐操作的问题 提供了更好的类型安全性 CLR 支持泛型 后续课程学习泛型接口
使用List<T>的流程和步骤
可以使用和数组类似的方式
输出结果
for (int i = 0; i < students.Count; i++) {
Student stuFor = (Student)students[i]; Console.WriteLine(); }
Scofield 张靓靓 周杰杰
foreach 方式
ArrayList 每个元素对应一个索引 HashTable 通常称为哈希表 根据键(Key)可以查找到相应的值(Value)
ArrayList
HashTable
object 0 object 1 object 2 object 3 object …
键 索引
键和值一一对应
Key Value 值 Key Value Key Value Key Value Key Value
{
Console.WriteLine();
}
遍历时不需要类型转换
List<T> 与 ArrayList
访问 List<T> 与 ArrayList 的对比
异同点 不同点
相同点
List<T>
ArrayList
增加元素时类型严格检查 可以增加任何类型
无需装箱拆箱
需要装箱拆箱
通过索引访问集合的元素
Console.WriteLine(); }
遍历Values
Dictionary<K,V>与哈希表
访问 Dictionary<K,V> 与 哈希表 的对比
异同点 不同点
相同点
Dictionary<K,V> 增加元素时类型严格检查
哈希表 可以增加任何类型
无需装箱拆箱
需要装箱拆箱
对象存储不 易控制
Teacher对象 成龙龙
添加对象
类型转换 容易出错
Student集合 Scofield 张靓靓 周杰杰
类型安全2
遍历集合
运行错误
List<T>的使用
引入命名空间:System.Collections.Generic List<Student> students = new List<Student>(); 利用List<Student>存储班级集合
//… students.Add(scofield);
添加学员
创建学员对象
连续添加三个学员对象 并获取集合元素的数目
ArrayList.Count获 取元素数目
演示示例1:MySchool
访问ArrayList元素
(类型) ArrayList[index] //按指定索引(下标)取得对象 需要类型转换
添加对象方法相同
通过索引删除元素
是否有哈希表那样存储Key和Value形式的泛型集合呢?
Dictionary<K,V>概述
Dictionary<K,V>具有List<T>相同的特性
<K,V>约束集合中元素类型 编译时检查类型约束 无需装箱拆箱操作
与哈希表类似存储Key和Value的集合
使用泛型集合List<T>
List<T>的访问方式与ArrayList相同
Student stu1 = students[2]; stu1.SayHi();
Students.RemoveAt(0);
使用索引访问,无需类型转换 利用索引删除
//List<Student> 方式
foreach (Student stu in students)
添加元素 存取单个元素 删除元素 遍历元素
使用Dictionary<K,V)的流程和步骤
定义Dictionary<K,V>泛型集合
获取泛型集合的元素 删除泛型集合的一个元素 遍历泛型集合的元素
上机练习
谢谢大家!
students.Add(scofield); … students.Add(jacky);
将Student对象加入班级 将Teacher对象加入班级
编译出错
遍历List<Student>集合
只能保存Student对象
foreach (Student stu in students) {
Console.WriteLine(); }
//遍历
通过对象遍历
foreach (Object stuo in students)
{ Student stuForeach = (Student)stuo;
类型转换
} Console.WriteLine(); 打印对象的Name属性
演示示例2:MySchool
为什么使用HashTable
Student stu1 = (Student)students[0]; stu1.SayHi(); …
转换为学员对象
按索引取值
ArrayList第一个对 象的索引是0
删除ArrayList的元素
ArrayList.Remove(对象名) //删除指定对象名的对象 ArrayList.RemoveAt(index) //删除指定索引的对象 ArrayList.Clear() //清除集合内的所有元素
students.RemoveAt(0); 通过索引删除对象 students.Remove(zhang); 通过指定对象删除
Student leave = (Student)students[0]; leave.SayHi();
只剩一个对象 剩余的元素会自动调整索引
取得删除后的第一个对象
ArrayList 的遍历
利用Dictionary<K,V>存储学员集合
Dictionary<string,Student> students = new Dictionary<string,Student>();
Key存储String类型
value存储 Student类型
Dictionary<K,V>的使用
Dictionary<K,V>的访问方式与哈希表相同
foreach (string name in students.Keys) {
Console.WriteLine(name); }
可以遍历Keys
Key Value Key Value Key Value Key Value Key Value
Values
ቤተ መጻሕፍቲ ባይዱ
类型安全1
MySchool中添加一个Teacher类
ArrayList通过索引获取对象
Student stu1 = (Student)Students[0];
通过关键字获取对象
Students["周杰杰"].SayHi();
能否像索引器那样通过关键字获取该对象呢?
C#提供一种集合
动态可维护长度 可通过关键字检索
HashTable
什么是HashTable
如何使用集合和泛型集合
数组的局限
string[] Students = new string[3] {"张三", "李四", "王五"};
班级人员的数组
相同类型和名称 变量的集合
如果每个班级的人数不固定 班级中来了一个新的学员
重新定义数组
调整大小困难
增加元素困难
能否动态的维护一个集合?
可维护动态长度的集合
不需类型转换
什么是泛型集合
Student对象
Teacher对象
允许添加
List<Student>
不允许添加
无需转换类型
Student对象
泛型最常见的用途是创建集合类 泛型集合可以约束集合内的元素类型 典型泛型集合List<T>,Dictionary<K,V>
<T>、<K,V>表示该泛型集合中的元素类型
students.Add(, scofield); 添加一对Key/Value
… student stu2 = students["周杰杰"];
通过Key获取元素
…
students.Remove("周杰杰");
通过Key删除元素
//Dictionary<string, Student> 方式 foreach (Student student in students.Values) {
using System.Collections; 引入命名空间 //… ArrayList Students = new ArrayList(); 实例化一个对象 ArrayList Teachers = new ArrayList(5); 可以指定长度
常见错误
未引入命名空间 定义时未实例化
ArrayList添加元素
ArrayList是一个可动态维护长度的集合
新增元素 可删除元素 可访问单个元素
自动调整 索引
通过索引 访问
0
object
01
object
12
object
23
object
34
object
索引(下标)
ArrayList
ArrayList的初始化
引入System.Collections命名空间 实例化ArrayList对象
students.Remove("周杰杰"); 通过key删除元素 …
演示示例5:MySchool
哈希表的遍历
如何遍历一个哈希表?
不能遍历整个对象,而 是遍历Values
foreach (Object stuo in students.Values) {
Student stu = (Student)stuo; Console.WriteLine(); }
给哈希表添加元素
使用哈希表
students.Add( , scofield);
添加元素
Key
获取哈希表的元素
Value
…
Student stu2 = (Student)students["周杰杰"];
stu2.SayHi();
…
需要类型转换
通过key获取元素
删除哈希表的元素
int Add(Object value) //添加一个对象到集合的末尾 返回索引
建立班级学员的集合
ArrayList students = new ArrayList();
Student scofield = new Student("Scofield", Genders.Male, 28, "越狱狱");
Teacher jacky = new Teacher(“周星驰", 4); jacky.SayHi(); students.Add(jacky); 能否加入一个
Teacher对象?
foreach (Object stuo in students) {
Student stu = (Student)stuo; Console.WriteLine(); } 遍历这个集合是否 有问题?
通过Key获取Value 添加对象方法相同
遍历方法相同
泛型的重要性
泛型集合与传统集合相比类型更安全
泛型集合无需装箱拆箱操作
泛型的重要性
泛型是未来五年的主流技术之一 解决了很多需要繁琐操作的问题 提供了更好的类型安全性 CLR 支持泛型 后续课程学习泛型接口
使用List<T>的流程和步骤
可以使用和数组类似的方式
输出结果
for (int i = 0; i < students.Count; i++) {
Student stuFor = (Student)students[i]; Console.WriteLine(); }
Scofield 张靓靓 周杰杰
foreach 方式
ArrayList 每个元素对应一个索引 HashTable 通常称为哈希表 根据键(Key)可以查找到相应的值(Value)
ArrayList
HashTable
object 0 object 1 object 2 object 3 object …
键 索引
键和值一一对应
Key Value 值 Key Value Key Value Key Value Key Value
{
Console.WriteLine();
}
遍历时不需要类型转换
List<T> 与 ArrayList
访问 List<T> 与 ArrayList 的对比
异同点 不同点
相同点
List<T>
ArrayList
增加元素时类型严格检查 可以增加任何类型
无需装箱拆箱
需要装箱拆箱
通过索引访问集合的元素
Console.WriteLine(); }
遍历Values
Dictionary<K,V>与哈希表
访问 Dictionary<K,V> 与 哈希表 的对比
异同点 不同点
相同点
Dictionary<K,V> 增加元素时类型严格检查
哈希表 可以增加任何类型
无需装箱拆箱
需要装箱拆箱
对象存储不 易控制
Teacher对象 成龙龙
添加对象
类型转换 容易出错
Student集合 Scofield 张靓靓 周杰杰
类型安全2
遍历集合
运行错误
List<T>的使用
引入命名空间:System.Collections.Generic List<Student> students = new List<Student>(); 利用List<Student>存储班级集合
//… students.Add(scofield);
添加学员
创建学员对象
连续添加三个学员对象 并获取集合元素的数目
ArrayList.Count获 取元素数目
演示示例1:MySchool
访问ArrayList元素
(类型) ArrayList[index] //按指定索引(下标)取得对象 需要类型转换
添加对象方法相同
通过索引删除元素
是否有哈希表那样存储Key和Value形式的泛型集合呢?
Dictionary<K,V>概述
Dictionary<K,V>具有List<T>相同的特性
<K,V>约束集合中元素类型 编译时检查类型约束 无需装箱拆箱操作
与哈希表类似存储Key和Value的集合
使用泛型集合List<T>
List<T>的访问方式与ArrayList相同
Student stu1 = students[2]; stu1.SayHi();
Students.RemoveAt(0);
使用索引访问,无需类型转换 利用索引删除
//List<Student> 方式
foreach (Student stu in students)
添加元素 存取单个元素 删除元素 遍历元素
使用Dictionary<K,V)的流程和步骤
定义Dictionary<K,V>泛型集合
获取泛型集合的元素 删除泛型集合的一个元素 遍历泛型集合的元素
上机练习
谢谢大家!
students.Add(scofield); … students.Add(jacky);
将Student对象加入班级 将Teacher对象加入班级
编译出错
遍历List<Student>集合
只能保存Student对象
foreach (Student stu in students) {
Console.WriteLine(); }
//遍历
通过对象遍历
foreach (Object stuo in students)
{ Student stuForeach = (Student)stuo;
类型转换
} Console.WriteLine(); 打印对象的Name属性
演示示例2:MySchool
为什么使用HashTable
Student stu1 = (Student)students[0]; stu1.SayHi(); …
转换为学员对象
按索引取值
ArrayList第一个对 象的索引是0
删除ArrayList的元素
ArrayList.Remove(对象名) //删除指定对象名的对象 ArrayList.RemoveAt(index) //删除指定索引的对象 ArrayList.Clear() //清除集合内的所有元素
students.RemoveAt(0); 通过索引删除对象 students.Remove(zhang); 通过指定对象删除
Student leave = (Student)students[0]; leave.SayHi();
只剩一个对象 剩余的元素会自动调整索引
取得删除后的第一个对象
ArrayList 的遍历
利用Dictionary<K,V>存储学员集合
Dictionary<string,Student> students = new Dictionary<string,Student>();
Key存储String类型
value存储 Student类型
Dictionary<K,V>的使用
Dictionary<K,V>的访问方式与哈希表相同
foreach (string name in students.Keys) {
Console.WriteLine(name); }
可以遍历Keys
Key Value Key Value Key Value Key Value Key Value
Values
ቤተ መጻሕፍቲ ባይዱ
类型安全1
MySchool中添加一个Teacher类
ArrayList通过索引获取对象
Student stu1 = (Student)Students[0];
通过关键字获取对象
Students["周杰杰"].SayHi();
能否像索引器那样通过关键字获取该对象呢?
C#提供一种集合
动态可维护长度 可通过关键字检索
HashTable
什么是HashTable
如何使用集合和泛型集合
数组的局限
string[] Students = new string[3] {"张三", "李四", "王五"};
班级人员的数组
相同类型和名称 变量的集合
如果每个班级的人数不固定 班级中来了一个新的学员
重新定义数组
调整大小困难
增加元素困难
能否动态的维护一个集合?
可维护动态长度的集合
不需类型转换
什么是泛型集合
Student对象
Teacher对象
允许添加
List<Student>
不允许添加
无需转换类型
Student对象
泛型最常见的用途是创建集合类 泛型集合可以约束集合内的元素类型 典型泛型集合List<T>,Dictionary<K,V>
<T>、<K,V>表示该泛型集合中的元素类型
students.Add(, scofield); 添加一对Key/Value
… student stu2 = students["周杰杰"];
通过Key获取元素
…
students.Remove("周杰杰");
通过Key删除元素
//Dictionary<string, Student> 方式 foreach (Student student in students.Values) {
using System.Collections; 引入命名空间 //… ArrayList Students = new ArrayList(); 实例化一个对象 ArrayList Teachers = new ArrayList(5); 可以指定长度
常见错误
未引入命名空间 定义时未实例化
ArrayList添加元素
ArrayList是一个可动态维护长度的集合
新增元素 可删除元素 可访问单个元素
自动调整 索引
通过索引 访问
0
object
01
object
12
object
23
object
34
object
索引(下标)
ArrayList
ArrayList的初始化
引入System.Collections命名空间 实例化ArrayList对象