您好,欢迎访问三七文档
第11章泛型集合课前回顾泛型的概述泛型的优点泛型类型参数类型参数的约束泛型类泛型接口泛型方法第11章泛型集合非泛型集合简介何时使用泛型集合选择集合类使用ListT集合使用DictionaryTKey,TValue)集合使用QueueT、StackT集合2020/1/19411.1非泛型集合ArrayList类Hashtable类SortedList类Queue类Stack类使用上面所有类之前,应该首先引入命名空间:usingSystem.Collections;5新增元素可删除元素可访问单个元素objectobjectobjectobject0123索引(下标)object40123ArrayList自动调整索引通过索引访问11.1.1ArrayList是一个可动态维护长度的集合6usingSystem.Collections;…ArrayListStudents=newArrayList();ArrayListTeachers=newArrayList(5)可以指定长度引入命名空间实例化一个对象常见错误未引入命名空间定义时未实例化引入System.Collections命名空间实例化ArrayList对象11.1.1ArrayList的初始化7intAdd(Objectvalue)//添加一个对象到集合的末尾ArrayListstudents=newArrayList();Studentscofield=newStudent(Scofield,Genders.Male,28,越狱);…students.Add(scofield);创建学员对象添加学员连续添加三个学员对象并获取集合元素的数目返回索引ArrayList.Count获取元素数目建立班级学员的集合11.1.1ArrayList添加元素8(类型)ArrayList[index]//按指定索引(下标)取得对象Studentstu1=(Student)students[0];stu1.SayHi();…按索引取值转换为学员对象ArrayList第一个对象的索引是0需要类型转换11.1.1访问ArrayList元素9ArrayList.Remove(对象名)//删除指定对象名的对象ArrayList.RemoveAt(index)//删除指定索引的对象ArrayList.Clear()//清除集合内的所有元素students.RemoveAt(0);students.Remove(zhang);Studentleave=(Student)students[0];leave.SayHi();通过索引删除对象通过指定对象删除只剩一个对象剩余的元素会自动调整索引取得删除后的第一个对象10//遍历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方式输出结果类型转换11.1.1ArrayList的遍历11//…students.Add(scofield);students.Add(zhang);students.Add(jay);students.RemoveAt(0);students.RemoveAt(1);students.RemoveAt(2);运行这段代码会发生错误?索引会自动调整删除两个元素后,不再有索引“2“11.1.1常见错误12Studentscofield=newStudent(Scofield,Genders.Male,28,越狱狱);…Studentstu2=newStudent(Scofield,Genders.Male,28,越狱狱);//打印集合数目…students.Remove(stu2);//打印集合数目…如果Remove(stu2),能否删除scofield对象?定义一个对象与前面的值相同两次的结果都是3,没有删除,为什么?在多态章节中我们将试图改变这一现象13publicstructStudent{publicStudent(stringname,intage){Name=name;Age=age;}publicstringName;publicintAge;}Studentstu1=newStudent(张三,20);Studentstu2=newStudent(李四,20);Studentstu3=newStudent(王五,20);ArrayListstudents=newArrayList();students.Add(stu1);students.Add(stu2);students.Add(stu3);staticvoidMain(string[]args){…//初始化代码将对象加入ArrayList集合foreach(Studentstuinstudents){StudentmyStudent=(Student)stu;myStudent.Age=60;}foreach(Studentstuinstudents){Console.WriteLine(stu.Age);}}遍历显示年龄结果是多少?结构是值类型定义一个学员结构使用ArrayList存储学员遍历修改年龄14ArrayList通过索引获取对象能否象索引器那样通过关键字获取该对象呢?动态可维护长度可通过关键字检索C#提供一种集合HashTableStudents[“周杰杰].SayHi();Studentstu1=(Student)Students[0];索引器通过关键字获取对象11.1.2为什么使用HashTable15ArrayList每个元素对应一个索引HashTable通常称为哈希表根据键(Key)可以查找到相应的值(Value)objectobjectobjectobjectobject0123…ArrayList索引KeyValueKeyValueKeyValueKeyValueKeyValueHashTable值键键和值一一对应11.1.2什么是HashTable16students.Add(scofield.Name,scofield);添加元素KeyValue…Studentstu2=(Student)students[“周杰杰];stu2.SayHi();…通过key获取元素students.Remove(“周杰杰);…通过key删除元素获取哈希表的元素删除哈希表的元素需要类型转换11.1.2使用哈希表17foreach(Objectstuoinstudents.Values){Studentstu=(Student)stuo;Console.WriteLine(stu.Name);}如何遍历一个哈希表?KeyValueKeyValueKeyValueKeyValueKeyValueValues不能遍历整个对象,而是遍历Valuesforeach(stringnameinstudents.Keys){Console.WriteLine(name);}可以遍历Keys2020/1/191811.1.3SortedListpublicstaticvoidMain(){SortedListmySL=newSortedList();mySL.Add(First,Hello);mySL.Add(Second,World);mySL.Add(Third,!);Console.WriteLine(mySL);Console.WriteLine(Count:{0},mySL.Count);Console.WriteLine(Capacity:{0},mySL.Capacity);Console.WriteLine(KeysandValues:);Console.WriteLine(\t-KEY-\t-VALUE-);for(inti=0;imySL.Count;i++){Console.WriteLine(\t{0}:\t{1},mySL.GetKey(i),mySL.GetByIndex(i));}}2020/1/191911.1.4QueuepublicstaticvoidMain(){QueuemyQ=newQueue();myQ.Enqueue(Hello);myQ.Enqueue(World);myQ.Enqueue(!);Console.WriteLine(myQ);Console.WriteLine(\tCount:{0},myQ.Count);Console.Write(\tValues:);foreach(ObjectobjinmyQ)Console.Write({0},obj);}2020/1/192011.1.5StackpublicstaticvoidMain(){StackmyStack=newStack();myStack.Push(Hello);myStack.Push(World);myStack.Push(!);Console.WriteLine(myStack);Console.WriteLine(\tCount:{0},myStack.Count);Console.Write(\tValues:);foreach(ObjectobjinmyStack)Console.Write({0},obj);}21泛型最常见的用途是创建集合类泛型集合可以约束集合内的元素类型典型泛型集合ListT,DictionaryK,VT、K,V表示该泛型集合中的元素类型ListStudentStudent对象Teacher对象允许添加不允许添加Student对象无需转换类型什么是泛型集合2020/1/192211.2何时使用泛型集合通常情况下,建议您使用泛型集合,因为这样可以获得类型安全的直接优点而不需要从基集合类型派生并实现类型特定的成员。此外,如果集合元素为值类型,泛型集合类型的性能通常优于对应的非泛型集合类型(并优于从非泛型基集合类型派生的类型),因为使用泛型时不必对元素进行装箱。也就说前面提到的非泛型集合都将尽量少用,而使用相对应的泛型集合2020/1/192311.2何时使用泛型集合ListT是对应于ArrayList的泛型类。DictionaryTKey,Tvalue是对应于Hashtable的泛型类。CollectionT是对应于CollectionBase的泛型类。CollectionT可以用作基类,但与CollectionBase不同的是它不是抽象的。这样使用起来要方便得多。ListT公开为只读集合。QueueT、StackT和SortedListTKey,Tvalue泛型类分别对应于与其同名的非泛型类。2020/1/192411.3选择集合类一定要谨慎选择System.Collections类。选用错误的类型可能限制您使用集合。考虑以下问题:您是否需要一个序列列表,其中的元素通常在检索其值后被放弃?如果需要,那么在需要先进先出(FIFO)行为时请考虑QueueT泛型类。在需要后进先出(LIFO)行为时请考虑使用StackT泛型类。如果不需要,请考虑使用其他集合。2020/1/192511.3选择集合类是否需要以某种顺序访问元素,例如FIFO、LIFO或随机访问?Queue类和QueueT泛型类提供FIFO访问。Stack类和StackT泛型类提供LIFO访问。LinkedListT泛型类允许从开头到末尾或
本文标题:11-泛型集合
链接地址:https://www.777doc.com/doc-3180003 .html