好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

C程序设计资料全集实用教案.ppt

26页
  • 卖家[上传人]:cn****1
  • 文档编号:571185890
  • 上传时间:2024-08-09
  • 文档格式:PPT
  • 文档大小:557KB
  • / 26 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 集合类型(lèixíng)概述•集合通常可以分为常用集合,￿专用集合等类型:•常用集合常用集合有泛型和非泛型之分非泛型集合是以Object￿类型为元素集合,如哈希表Hashtable、队列Queue、堆栈Stack、和列表ArrayList,泛型集合类型是非泛型类型的直接模拟泛型集合包含ArrayList的泛型版List,Hashtable的泛型版Dictionary集合等￿•专用集合这些(zhèxiē)集合都具有专门的用途,通常用于处理特定的元素类型,如￿StringDictionary是将键和值强类型化为字符串而不是Object来实现Hashtable集合类型集合(jíhé)类型第1页/共25页第一页,共26页 IEnumerable接口(jiē￿kǒu)•集合是基于IEnumerable接口、ICollection接口、IList接口、IDictionary接口,或其泛型集合中的相应接口,而IEnumerable接口、ICollection接口是大部分集合类所共同实现的下面分别介绍IEnumerable接口、ICollection接口•第一种集合是实现IEnumerable接口的集合类,IEnumerable接口只有一个公共方法:IEnumerator￿GetEnumerator()￿该方法返回一个用于foreach简单迭代循环访问集合的枚举数。

      所有实现了IEnumerable接口的集合类如数组Array,ArrayList集合类型等都可以用于foreach循环语句(yǔjù)IEnumerator接口的成员如下表￿￿集合(jíhé)类型属性Current 获取集合中的当前元素方法MoveNext 将枚举数推进到集合的下一个元素 方法Reset 将枚举数设置为其初始位置,该位置位于集合中第一个元素第2页/共25页第二页,共26页 ICollection￿接口(jiē￿kǒu)ICollection￿接口(jiē￿kǒu)继承IEnumerable接口(jiē￿kǒu),除了继承IEnumerable接口(jiē￿kǒu)成员外,还有下表所示的成员￿属性Count 获取 ICollection 中包含的元素数属性IsSynchronized 获取一个值,该值指示是否同步对ICollection的访问(线程安全)属性SyncRoot 获取可用于同步 ICollection 访问的对象方法CopyTo 从特定Array 索引处开始,将ICollection元素复制到一个Array 集合(jíhé)类型第3页/共25页第三页,共26页。

      List￿接口(jiē￿kǒu)List￿接口表示可按照索引单独访问的对象的非泛型集合接口IList￿接口继承了ICollection接口和IEnumerable接口,IList是所有非泛型列表的基接口IList接口的公共属性(shǔxìng)与方法￿如下表:数数组组Array、、ArrayList和和List泛泛型型类类属性IsFixedSize 获取一个值,指示 IList 是否具有固定大小属性IsReadOnly 获取一个值,该值指示 IList 是否为只读属性Item 获取或设置指定索引处的元素方法Add 将某项添加到 IList 中 方法Clear 从 IList 中移除所有项 方法Contains 确定 IList 是否包含特定值 方法IndexOf 确定 IList 中特定项的索引 方法Insert 将一个项插入指定索引处的 IList 方法Remove 从 IList 中移除特定对象的第一个匹配项 方法RemoveAt 移除指定索引处的 IList 项 第4页/共25页第四页,共26页 数组Array类•Array￿类是所有数组的基类,提供创建、操作、搜索和排序数组的方法,Array￿类定义语法如下:public￿abstract￿class￿Array￿:￿ICloneable,￿IList,￿ICollection,￿IEnumerable。

      因此Array类实现IList,￿ICollection,￿IEnumerable,ICloneable接口,也就是说,Array类实现了这些接口的方法成员•Array类除了Copy,CopyTo外其它(qítā)常用的方法:•Array.Clear方法:public￿static￿void￿Clear￿(Array￿array,int￿index,int￿length)￿•Array.Clone方法是实现ICloneable接口的方法,Clone方法创建数组Array的浅表副本,数组的浅表副本仅复制数组的元素(无论它们是引用类型还是值类型),但不复制这些引用所引用的对象新数组中的引用与原始数组中的引用指向相同的对象数组使用Copy,CopyTo方法复制的也是浅表副本所以这三个复制方法得到的复制的副本都是一样￿数数组组Array、、ArrayList和和List泛泛型型类类第5页/共25页第五页,共26页 public class Student{public string Name;public Student(string Name){this.Name = Name;}}public class CloneCopyArray{public static void Main(){Student stu0 = new Student("student1");Student stu1 = new Student("student2");Student stu2 = new Student("student3");Student[] arrStu = new Student[] { stu0, stu1, stu2};Student[] arrStuClone = (Student[])arrStu.Clone();// 克隆数组Student[] arrStuCopy = new Student[arrStu.Length];Array.Copy(arrStu,arrStuCopy, arrStu.Length);//拷贝(kǎobèi)数组Console.WriteLine("原来数组内容");PrintIndexAndValues(arrStu);Console.WriteLine("克隆数组内容:");PrintIndexAndValues(arrStuClone);Console.WriteLine("改变克隆数组内容之前");例:演示数组Array的Copy和Clone方法(fāngfǎ)的使用, CloneCopyArray项目代码:第6页/共25页第六页,共26页。

      Console.WriteLine("arrStu[2].Name: {0}", arrStu[2].Name);Console.WriteLine("arrStuClone[2].Name: {0}", arrStuClone[2].Name);Console.WriteLine("arrStuCopy[2].Name: {0}", arrStuCopy[2].Name);arrStuClone[2].Name = "student2CloneNew";//arrStuCopy[2].Name = "student2CopyNew";Console.WriteLine("改变克隆数组内容之后(zhīhòu)");Console.WriteLine("arrStu[2].Name: {0}", arrStu[2].Name);Console.WriteLine("arrStuClone[2].Name: {0}", arrStuClone[2].Name);Console.WriteLine("arrStuCopy[2].Name: {0}", arrStuCopy[2].Name);}public static void PrintIndexAndValues(Array myArray){for (int i = myArray.GetLowerBound(0); i <= myArray.GetUpperBound(0); i++)Console.WriteLine("\t[{0}]:\t{1}", i, myArray.GetValue(i));}}arrStuClone是使用clone方法复制的student类对象数组,arrStuCopy是使用copy方法复制的student类对象数组,由于它们都是复制的浅表副本,所以在三个数组的引用都指向相同的student类对象数组。

      第7页/共25页第七页,共26页 ArrayList￿类•Array用作所有数组的基类,而ArrayList是较为复杂的数组ArrayList￿类和Array￿类一样都实现IList,￿ICollection,￿IEnumerable,￿ICloneable接口•ArrayList类除了所实现的IList,￿ICollection,￿IEnumerable,￿ICloneable接口的方法成员,还包含(bāohán)下面主要属性和方法:属性Capacity 获取或设置 ArrayList 可包含的元素数方法AddRange 将 ICollection 的元素添加到 ArrayList 的末尾 方法BinarySearch 使用对分检索算法在已排序ArrayList或它的部分中查找特定元素 方法InsertRange 将集合中的某个元素插入 ArrayList 的指定索引处 方法RemoveRange 从 ArrayList 中移除一定范围的元素 方法SetRange 将集合中的元素复制到 ArrayList 中一定范围的元素上 方法Sort 对 ArrayList 或它的一部分中的元素进行排序。

      方法ToArray 将 ArrayList 的元素复制到新数组中 第8页/共25页第八页,共26页 使用ArrayList类Add、AddRange和ToArray方法的项目ArrayListSample代码: using System;using System.Collections;public class SamplesArrayList{ public static void Main() { ArrayList myAL = new ArrayList();// 创建和初始化ArrayList. myAL.Add("The");//添加(tiān jiā)一个元素 myAL.AddRange(new string[] { "quick", "brown", "fox", "jumped", "over", "the", "lazy", "dog" });//添加(tiān jiā)一组元素 PrintIndexAndValues(myAL); // 显示ArrayList的值 String[] myArr = (String[])myAL.ToArray(typeof(string)); //将元素复制数组 PrintIndexAndValues(myArr); // 显示数组内容 } public static void PrintIndexAndValues(ArrayList myList) { int i = 0; foreach (Object o in myList) Console.Write("\t[{0}]:\t{1}", i++, o); } public static void PrintIndexAndValues(String[] myArr) { for (int i = 0; i < myArr.Length; i++) Console.Write("\t[{0}]:\t{1}", i, myArr[i]); }}第9页/共25页第九页,共26页。

      List￿泛型类•List￿泛型类是￿ArrayList￿类的泛型等效类,表示可通过索引访问的强类型列表所谓的强类型,是指创建列表List时指定集合类型,而不是ArrayList的object集合类型,这样对于值类型的List泛型类来说,无需装箱和取消装箱或转换•ListTSample项目(xiàngmù)的代码示例演示￿List￿泛型类:•using￿System;•using￿System.Collections.Generic;•public￿class￿Example{•￿￿￿￿public￿static￿void￿Main()•￿￿￿￿{￿￿￿//创建string的List泛型实例,创建列表时指定集合类型为string•￿￿￿￿￿￿￿￿List￿dinosaurs￿=￿new￿List();•￿￿￿￿￿￿￿￿Console.WriteLine("\nCapacity:￿{0}",￿dinosaurs.Capacity);//显示List容量•￿￿￿￿￿￿￿￿dinosaurs.Add("Tyrannosaurus");//向List添加•￿￿￿￿￿￿￿￿dinosaurs.Add("Amargasaurus");•￿￿￿￿￿￿￿￿dinosaurs.Add("Mamenchisaurus");•￿￿￿￿dinosaurs.Add("Deinonychus");第10页/共25页第十页,共26页。

      dinosaurs.Add("Compsognathus");foreach (string dinosaur in dinosaurs) Console.WriteLine(dinosaur);Console.WriteLine("\nCapacity: {0}", dinosaurs.Capacity);Console.WriteLine("Count: {0}", dinosaurs.Count);Console.WriteLine("\nContains(\"Deinonychus\"): {0}", dinosaurs.Contains("Deinonychus"));//判断列表是否包含"Deinonychus"dinosaurs.Insert(2, "Compsognathus");//在位置插入"Compsognathus“foreach (string dinosaur in dinosaurs) Console.WriteLine(dinosaur);Console.WriteLine("\ndinosaurs[3]: {0}", dinosaurs[3]);//使用位置索引(suǒyǐn)dinosaurs.Remove("Compsognathus");//删除"Compsognathus"foreach (string dinosaur in dinosaurs)Console.WriteLine(dinosaur);dinosaurs.TrimExcess();//根据集合数量缩减容量Console.WriteLine("\nTrimExcess()\nCapacity: {0}", dinosaurs.Capacity);Console.WriteLine("Count: {0}", dinosaurs.Count);dinosaurs.Clear();//清空Console.WriteLine ("\nClear()\nCapacity: {0}", dinosaurs.Capacity);Console.WriteLine("Count: {0}", dinosaurs.Count); }}第11页/共25页第十一页,共26页。

      List￿泛型类代码分析:使用默认构造函数创建一个空的字符串类型的List泛型列表随后显示￿Capacity￿属性,然后使用￿Add￿方法添加若干个项添加的项被列出,Capacity￿属性会同￿Count￿属性一起再次显示,指示已根据需要(xūyào)增加了容量￿使用￿Contains￿方法测试该列表中是否存在某个项,使用￿Insert￿方法在列表的中间插入一个新项,然后再次显示列表的内容￿默认的￿Item￿属性(C#￿中的索引器)用于检索项,Remove￿方法用于移除前面添加的重复项的第一个实例,然后,该示例再次显示内容Remove￿方法总是移除它所遇到的第一个实例使用￿TrimExcess￿方法减小容量以匹配计数,然后显示￿Capacity￿和￿Count￿属性如果未用容量已经小于总容量的￿10%,则列表容量不会进行调整使用￿Clear￿方法移除列表中的所有项,并显示￿Capacity￿和￿Count￿属性数数组组Array、、ArrayList和和List泛泛型型类类第12页/共25页第十二页,共26页 List,ArrayList￿类与Array数组的区别(qūbié):Array￿的容量是固定的,而￿ArrayList的容量可根据需要自动扩充。

      如果更改了￿Capacity￿属性的值,则可以自动进行内存重新分配和元素复制ArrayList提供(tígōng)添加、插入或移除某一范围元素的方法在￿Array￿中,只能一次获取或设置一个元素的值使用￿Synchronized￿方法很容易创建￿ArrayList￿的同步版本Array￿将实现同步的任务留给了用户ArrayList提供(tígōng)将只读和固定大小包装返回到集合的方法;而￿Array￿不提供(tígōng)可以设置￿Array￿的下限,但￿ArrayList的下限始终为零Array￿可以具有多个维度,而￿ArrayList始终只是一维的特定类型(不包括Object)的数组Array的性能优于ArrayList,这是因为ArrayList的元素属于Object类型,所以在存储或检索值类型时通常发生装箱和取消装箱操作不过,在不需要重新分配时(即最初的容量十分接近列表的最大容量),List泛型类的性能与同类型的数组十分相近需要数组的大多数情况都可以改为使用ArrayList或List泛型类;它们更容易使用,并且一般与相同类型的数组具有相近的性能尽量使用List类,而不是使用ArrayList类或自己编写强类型包装集合。

      数数组组Array、、ArrayList和和List泛泛型型类类第13页/共25页第十三页,共26页 Hashtable￿、Dictionary和SortedList集合(jíhé)类￿Hashtable￿、Dictionary和SortedList集合类都实现IDictionary,￿ICollection,￿IEnumerable,￿ICloneable接口其中IDictionary接口表示键/值对的集合接口,或者说Hashtable￿、Dictionary和SortedList都是关于键/值对的集合IDictionary接口是键/值对的非通用集合的基接口每个元素都是一个存储在￿DictionaryEntry对象中的键/值对￿IDictionary接口继承(jìchéng)了ICollection,￿IEnumerable接口,除了ICollection,IEnumerable接口成员外,还有以下成员:第14页/共25页第十四页,共26页 属性IsFixedSize 获取一个值,该值指示 IDictionary 对象是否具有固定大小属性IsReadOnly 获取一个值,该值指示 IDictionary 对象是否为只读。

      属性Item 获取或设置具有指定键的元素属性Keys 获取 ICollection 对象,它包含 IDictionary 对象的键属性Values 获取 ICollection 对象,它包含 IDictionary 对象中的值方法Add 在 IDictionary 对象中添加一个带有所提供的键和值的元素 方法Clear 从 IDictionary 对象中移除所有元素 方法Contains 确定 IDictionary 对象是否包含具有指定键的元素 方法GetEnumerator 返回一个用于IDictionary对象的IDictionaryEnumerator对象 方法Remove 从 IDictionary 对象中移除带有指定键的元素 IDictionary接口(jiē kǒu)成员第15页/共25页第十五页,共26页 using System.Collections;//使用Hashtable类的项目HashtableSample的代码 :public class SamplesHashtable{ public static void Main() { Hashtable ht = new Hashtable();//创建Hashtable实例ht ht.Add("N01", "张三");//添加将带有指定键和值的元素添加到ht ht.Add("N02", "李四"); ht.Add("N03", "王五"); Console.WriteLine("ht:Count:{0}", ht.Count); //显示Hashtable的属性Count PrintKeysAndValues(ht); } public static void PrintKeysAndValues(Hashtable ht) { foreach (DictionaryEntry de in ht)//显示Hashtable的键和值 Console.Write("({0},{1})", de.Key, de.Value); }}使用Hashtable的Add(Objectkey, Objectvalue)方法集合添加元素。

      Hashtable的元素是一个键/值对,元素类型既不是键的类型,也不是值的类型,而是DictionaryEntry类型,因此(yīncǐ)foreach循环语句使用foreach(DictionaryEntryde in ht)DictionaryEntry是结构类型,具有object类型的键属性Key和object类型的值属性Key 第16页/共25页第十六页,共26页 使用Dictionary泛型类DictionarySample项目(xiàngmù)代码:public class Sample{ public static void Main() { // 创建键和值都为string的dictionary对象实例openWith. Dictionary openWith =new Dictionary(); //为dictionary实例openWith添加元素,其中键值唯一,有些值是重复的 openWith.Add("txt", "notepad.exe"); openWith.Add("bmp", "paint.exe"); openWith.Add("dib", "paint.exe"); openWith.Add("rtf", "wordpad.exe"); try {//插入(chā rù)具有重复键的元素因起异常 openWith.Add("txt", "winword.exe"); } catch (ArgumentException) { Console.WriteLine("An element with Key = \"txt\" already exists."); } // 使用键索引得到其值 Console.WriteLine("For key = \"rtf\", value = {0}.",openWith["rtf"]); openWith["rtf"] = "winword.exe";//使用键索引设置其值 Console.WriteLine("For key = \"rtf\", value = {0}.",openWith["rtf"]); openWith["doc"] = "winword.exe";//如果该键不存在,添加新key/value元素第17页/共25页第十七页,共26页。

      try {//如果没有(méi yǒu)该键,取其值引起异常 Console.WriteLine("For key = \"tif\", value = {0}.",openWith["tif"]); } catch (KeyNotFoundException) { Console.WriteLine("Key = \"tif\" is not found."); } string value = ""; if (openWith.TryGetValue("tif", out value)){//该方法更有效,不引起异常Console.WriteLine("For key = \"tif\", value = {0}.", value); } else { Console.WriteLine("Key = \"tif\" is not found."); } if (!openWith.ContainsKey("ht")){//判断是否含有该键 openWith.Add("ht", "hypertrm.exe"); Console.WriteLine("Value added for key = \"ht\": {0}",openWith["ht"]); } foreach (KeyValuePair kvp in openWith)//遍历该字典Console.WriteLine("Key = {0}, Value = {1}",kvp.Key, kvp.Value); //取该字典值属性,值集合ValueCollection是强类型集合(本例string类型) Dictionary.ValueCollection valueColl =openWith.Values; foreach (string s in valueColl)//遍历该字典值集合ValueCollectionConsole.WriteLine("Value = {0}", s); 第18页/共25页第十八页,共26页。

      //取该字典的键属性,键集合(jíhé)KeyCollection是强类型集合(jíhé)(本例string类型) Dictionary.KeyCollection keyColl = openWith.Keys; foreach (string s in keyColl)//遍历该字典键集合(jíhé)ValueCollection { Console.WriteLine("Key = {0}", s); } Console.WriteLine("\n删除键为(\"doc\")的这对元素"); openWith.Remove("doc"); if (!openWith.ContainsKey("doc")) { Console.WriteLine("Key \"doc\" is not found."); } }}代码分析:使用Item属性(即索引器)来检索值,当请求的键不存在时将引发KeyNotFoundException,与键相关联的值可被替换。

      当程序必须经常尝试字典中不存在的键值时,使用TryGetValue方法作为一种更有效的方法来检索值,使用ContainsKey方法在调用Add方法之前测试某个键是否存在使用Keys属性和Values属性来单独枚举键和值使用Remove方法删除集合(jíhé)中的一个元素第19页/共25页第十九页,共26页 Queue类和Queue泛型类￿•Queue类和Queue泛型类都是先进先出集合类,它们实现IEnumerable、ICollection和ICloneable等接口,Queue泛型类还实现了IEnumerable和ICollection泛型接口•队列在按接收顺序存储消息方面可以方便地进行顺序处理此类将队列作为循环数组实现存储在Queue中的对象在一端插入,从另一端移除Queue接受空引用作为有效值并且允许重复的元素(yuán￿sù)•可以对Queue及其元素(yuán￿sù)执行三种主要操作:•Enqueue将一个元素(yuán￿sù)添加到Queue的末尾•Dequeue从Queue的开始处移除最旧的元素(yuán￿sù)•Peek从Queue的开始处返回最旧的元素(yuán￿sù),但不将其从Queue中移除。

      •下面是使用队列Queue泛型类的QueueSample项目的代码:第20页/共25页第二十页,共26页 using System.Collections.Generic;class Example{ public static void Main() { Queue numbers = new Queue(); numbers.Enqueue("one"); numbers.Enqueue("two"); numbers.Enqueue("three"); numbers.Enqueue("four"); numbers.Enqueue("five"); foreach (string number in numbers) { Console.WriteLine(number); } Console.WriteLine("\nDequeuing '{0}'", numbers.Dequeue()); Console.WriteLine("Peek at next item: {0}", numbers.Peek()); Console.WriteLine("Dequeuing '{0}'", numbers.Dequeue()); // 使用 ToArray 方法(fāngfǎ)将队列元素复制到数组,然后将该数组 //传递给接受 IEnumerable 的 Queue 构造函数以创建队列副本 Queue queueCopy = new Queue(numbers.ToArray()); foreach (string number in queueCopy) { Console.WriteLine(number); }第21页/共25页第二十一页,共26页。

      //创建一个大小是队列(duìliè)大小两倍的数组 string[] array2 = new string[numbers.Count * 2]; //使用 CopyTo 方法从数组中间开始复制数组元素 numbers.CopyTo(array2, numbers.Count); //使用接受IEnumerable 的Queue 构造函数创建第二个队列(duìliè) Queue queueCopy2 = new Queue(array2); foreach (string number in queueCopy2) { Console.WriteLine(number); } Console.WriteLine("\nqueueCopy.Contains(\"four\") = {0}", queueCopy.Contains("four")); queueCopy.Clear(); Console.WriteLine("\nqueueCopy.Count = {0}", queueCopy.Count); }}•使用 Enqueue 方法将五个字符串加入队列进行排队。

      使用 Dequeue 方法使第一个字符串出列使用 Peek 方法查找队列中的下一项•使用 ToArray 方法创建一个数组并将队列元素复制到该数组,然后将该数组传递给接受 IEnumerable 的 Queue 构造函数以创建队列副本,并显示副本的元素•创建一个大小是队列大小两倍的数组,并使用CopyTo方法从数组中间(zhōngjiān)开始复制数组元素使用 Contains 方法显示字符串“four”在第一个队列副本中,然后使用 Clear 方法清除此副本,并由 Count 属性显示该队列为空第22页/共25页第二十二页,共26页 堆栈(duīzhàn)Stack￿类和￿Stack￿泛型类￿•堆栈集合类型Stack类和Stack泛型类都是后进先出集合类,它们实现IEnumerable、ICollection和ICloneable等接口,Stack泛型类还实现了IEnumerable和ICollection泛型接口•可以使用堆栈和队列存储临时信息,如果需要按照信息存储在集合中的顺序来访问(fǎngwèn)这些信息,使用队列Queue如果需要以相反的顺序访问(fǎngwèn)这些信息,使用堆栈Stack。

      Stack常用于在调用其他过程期间保留变量状态•可以对Stack及其元素执行三种主要操作:•Push可在Stack的顶部插入一个元素•Pop可在Stack的顶部移除一个元素•Peek可返回处于Stack顶部的元素,但不将其从Stack上移除￿第23页/共25页第二十三页,共26页 class Example{ public static void Main() { Stack numbers = new Stack(); numbers.Push("one"); numbers.Push("two"); foreach (string number in numbers) { Console.WriteLine(number); } Console.WriteLine("\nPopping '{0}'", numbers.Pop()); Console.WriteLine("Peek at next item: {0}",numbers.Peek()); //使用 ToArray 方法创建数组并将堆栈元素复制到其中, // 然后将数组传递(chuándì)给具有 IEnumerable 的 Stack 构造函数. Stack stack2 = new Stack(numbers.ToArray()); foreach (string number in stack2) { Console.WriteLine(number); } Console.WriteLine("stack2.Contains(\"four\")={0}",stack2.Contains("four")); stack2.Clear(); Console.WriteLine("\nstack2.Count = {0}", stack2.Count); }}用堆栈Stack泛型类的几个方法(fāngfǎ)。

      下面是StackSample项目的代码: 第24页/共25页第二十四页,共26页 感谢您的欣赏(xīnshǎng)!第25页/共25页第二十五页,共26页 内容(nèiróng)总结集合类型概述常用集合有泛型和非泛型之分将枚举数设置(shèzhì)为其初始位置,该位置位于集合中第一个元素第2页/共25页第3页/共25页第24页/共25页感谢您的欣赏第二十六页,共26页。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.