当前位置:文档之家› 11-泛型集合

11-泛型集合

自动调整 索引 新增元素 ArrayLis t
0
1 0
object
object object object object
可删除元素
2 1
3 2 4 3
通过索引 访问 索引(下标)
可访问单个元素
5
11.1.1 ArrayList的初始化
引入System.Collections命名空间 实例化ArrayList对象
2012-12-30 20
什么是泛型集合
Student对象 Teacher对象 List<Stude nt>
允许添加
不允许添加 无需转换类型
Student对象
泛型最常见的用途是创建集合类 泛型集合可以约束集合内的元素类型 典型泛型集合List<T>,Dictionary<K,V>
<T>、<K,V>表示该泛型集合中的元素类型
21
11.2 何时使用泛型集合
通常情况下,建议您使用泛型集合,因为这样可以获得 类型安全的直接优点而不需要从基集合类型派生并实现 类型特定的成员。此外,如果集合元素为值类型,泛型 集合类型的性能通常优于对应的非泛型集合类型(并优 于从非泛型基集合类型派生的类型),因为使用泛型时 不必对元素进行装箱。 也就说前面提到的非泛型集合都将尽量少用,而使用相 对应的泛型集合
15
0 1 2 3 …
索引

Key Key Key
Valu e Value Value

键和值一一对应
Key
Key
Value
Value
11.1.2 使用哈希表
students.Add( , scofield); Key Value 添加元素
获取哈希表的元素
… Student stu2 = (Student)students[“周杰杰"]; stu2.SayHi(); 通过key获取元素 需要类型转换 …
ArrayList第一个 对象的索引是0
8
ArrayList.Remove(对象名) //删除指定对象名的对象 ArrayList.RemoveAt(index) //删除指定索引的对象 ArrayList.Clear() //清除集合内的所有元素
students.RemoveAt(0);通过索引删除对象
{ Student stuFor = (Student)students[i]; Console.WriteLine(); } 输出结果
Scofiel d 张靓靓 周杰杰
foreach 方式
通过对象遍历 //遍历 foreach (Object stuo in students) { 类型转换 Student stuForeach = (Student)stuo; Console.WriteLine(); 打印对象的Name属 } 性
通过指定对象删除 students.Remove(zhang); Student leave = (Student)students[0]; 取得删除后的第一个对象 leave.SayHi(); 只剩一个对象 剩余的元素会自动调整索引
9
11.1.1 ArrayList 的遍历
可以使用和数组类似的方 式 for (int i = 0; i < students.Count; i++)
7
ArrayList.Count 获取元素数目
Байду номын сангаас
11.1.1 访问ArrayList元素
(类型) ArrayList[index] //按指定索引(下标)取 得对象 需要类型转换 Student stu1 = (Student)students[0]; 按索引取值 stu1.SayHi(); …
转换为学员对象
2012-12-30
22
11.2 何时使用泛型集合
结构是值类型
13
11.1.2为什么使用HashTable
ArrayList通过索引获取对象
Student stu1 = (Student)Students[0];
索引器通过关键字获取对象
Students[“周杰杰"].SayHi();
能否象索引器那样通过关键字获取该对象呢?
动态可维护长度 C#提供一种集合 可通过关键字检索
10
11.1.1 常见错误
//… students.Add(scofield); students.Add(zhang); students.Add(jay); students.RemoveAt(0); students.RemoveAt(1); students.RemoveAt(2);
索引会自动调整删除 两个元素后,不再有 索引“2“
int Add(Object value) //添加一个对象到集合的 末尾 返回索引
建立班级学员的集合
ArrayList students = new ArrayList(); Student scofield = new Student("Scofield", Genders.Male, 28, "越狱"); 创建学员对象 添加学员 … students.Add(scofield); 连续添加三个学员对象 并获取集合元素的数目
运行这段代码会发生错误?
11
Student scofield = new Student("Scofield", Genders.Male, 28, "越狱狱"); … Student stu2 = new Student("Scofield", Genders.Male, 28, " 定义一个对象与前面的值相同 越狱狱"); //打印集合数目 … students.Remove(stu2); //打印集合数目 … 如果Remove(stu2),能否删除scofield对象? 两次的结果都是3,没有删除,为什么? 在多态章节中我们将试图改变这一现象
11.1 非泛型集合
ArrayList类 Hashtable 类 SortedList类 Queue类 Stack类
使用上面所有类之前,应该首先引入命名空间: using System.Collections;
2012-12-30 4
11.1.1ArrayList是一个可动态维护长度的 集合
18
11.1.4 Queue
public static void Main() { Queue myQ = new Queue(); myQ.Enqueue("Hello"); myQ.Enqueue("World"); myQ.Enqueue("!"); Console.WriteLine("myQ"); Console.WriteLine("\tCount: {0}", myQ.Count); Console.Write("\tValues:"); foreach (Object obj in myQ) Console.Write(" {0}", obj); }
2012-12-30 19
11.1.5 Stack
public static void Main() { Stack myStack = new Stack(); myStack.Push("Hello"); myStack.Push("World"); myStack.Push("!"); Console.WriteLine("myStack"); Console.WriteLine("\tCount: {0}", myStack.Count); Console.Write("\tValues:"); foreach (Object obj in myStack) Console.Write(" {0}", obj); }
12
定义一个学员结构 使用ArrayList存储学员 遍历修改年龄
遍历显示年龄结果是多少?
static void Main(string[] args) public struct Student { Student stu1 = new Student("张三",20); …//初始化代码将对象加入ArrayList集合 { Student stu2 = new Student("李四", 20); Student stu3 = new Student("王五", 20); foreach (Student stu in students)int age public Student(string name, {{ Name = name; Age = age; } ArrayList students = new ArrayList(); Student myStudent public string Name; = (Student)stu; students.Add(stu1); = 60; myStudent.Age public int Age; students.Add(stu2); } } students.Add(stu3); in students) foreach (Student stu { Console.WriteLine(stu.Age); } }
删除哈希表的元素
students.Remove(“周杰杰"); 通过key删除元素 …
16
如何遍历一个哈希表?
不能遍历整个对象,而 是遍历Values
foreach (Object stuo in students.Values) { Student stu = (Student)stuo; Console.WriteLine(); } foreach (string name in students.Keys) { Console.WriteLine(name); } 可以遍历Keys
相关主题