欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    C#程序设计经典教程.ppt

    • 资源ID:5416948       资源大小:384KB        全文页数:37页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C#程序设计经典教程.ppt

    1,C#程序设计经典教程,第六章 集合、索引器与泛型,1.总体要求了解.NET类库中的集合类,初步掌握常用集合的创建和操作方法。理解索引器的概念,能区别索引器与属性,掌握索引器的定义与使用。了解泛型的相关概念,初步掌握泛型接口、泛型类、泛型属性和泛型方法的使用。2.相关知识点熟悉类和数组的定义和使用。熟悉类的方法成员的定义与使用等基本操作。,3.学习重点集合、索引器、泛型的定义与使用。4.学习难点索引器的作用、定义与使用方法泛型的概念和意义,泛型的定义和使用方法,第六章 集合、索引器与泛型,第六章 集合、索引器与泛型,主要内容6.1 集合6.2 索引器6.3 泛型,6.1 集合,6.1.1 集合概述 6.1.2 ArrayList 6.1.3 哈希表Hashtable6.1.4 栈和队列,6.1.1 集合概述,集合能随意调整大小,集合可以把一组类似的对象组合在一起。任何类型的对象都可被组合到一个Object类型的集合中,并通过C#的foreach语句来访问其中的每一个对象。操作过程中MyClass 的对象与Object对象之间 MyClass mcObj;装箱:Object obj=mcObj(无需显式转换)拆箱:mcObj=(MyClass)obj(事先装箱的)对象类型的集合位于System.Collections命名空间;,6.1 数组类 Array,数组是简单集合System.Array类是所有数组的基类(特殊类,不能用于派生),public abstract class Array:ICloneable,IList/类体:实现了多个接口/(数组操作的常用属性和方法,多为静态),interface ICollectionint Count get;void CopyTo(Array array,int index);bool IsSynchronizedget;object SynchRootget;,interface ICloneable object Clone();,interface IList:Collection,IEnumerable int Add(objdect value);void Clear();bool Contains(object value);int IndexOf(object value);void Remove(object key);void RemoveAt(int index);void Insert(int index,object value);,interface IEnumerator Object Current get;bool MoveNext();void Reset(),interface IEnumerable/foreach 遍历的基础 IEnumerator Getenumerator();,public static void Main()int a=new int 3;Array b=Array.CreateInstance(typeof(int),3);for(int i=0;i3;i+)a I=2*i;b.SetValue(3*i,i);foreach(int x in a)console.Write(“0”,x);foreach(int x in b)console.Write(“0”,x);,接口中的方法:默认是public abstract 的。继承接口的类:必须实现接口中的所有属性和方法,否则该类是抽象的。,6.1.4 栈和队列,1栈Stack Stack类实现了先进后出的数据结构,这种数据结构在插入或删除对象时,只能在栈顶插入或删除。创建栈对象的一般形式如下:Stack 栈名=new Stack();Stack类提供了栈常用操作方法,包括在栈顶添加数据、移除栈顶数据、返回栈顶数据、清空栈和检查是否包含某个数据等,方法名分别为Push、Pop、Peek、Clear和Contains。其中,Push和Pop每操作一次只能添加或删除一个数据。,a1,a2,an,栈底,栈顶,出栈,进栈,6.1.4 栈和队列,2队列QueueQueue类实现了先进先出的数据结构,这种数据结构把对象放进一个等待队列中,当插入或删除对象时,对象从队列的一端插入,从另外一端移除。队列可以用于顺序处理对象,因此队列可以按照对象插入的顺序来存储。创建队列对象的一般形式如下:Queue 队列名=new Queue(队列长度,增长因子);其中,队列长度默认为32。增长因子默认为2.0,即每当队列容量不足时,队列长度调整为原来的2倍,可重新设置增长因子的大小。,a1 a2 a3 an,队头,队尾,出队,入队,10,集合类的选择,选择集合类时,一般要考虑以下问题:(1)是否需要一个序列列表,需要先进先出行为时可使用 Queue 队列类,在需要后进先出行为时可使用 Stack栈类。(2)是否需要随机访问集合中的元素,此时不能选择Queue 队列类、Stack栈类、LinkedList 双向链表类(3)是否需要通过索引访问每个元素,只有ArrayList、StringCollection等是从索引为零的元素开始逐个访问集合元素。Hashtable、Dictionary通过元素的键(即元素名字)提供对元素的访问。而NameValueCollection 类和SortedList 泛型类通过其元素的从零开始的索引,或者通过其元素的键提供对元素的访问。(4)是否包含一个值、一个键和一个值的集合,还是一个键和多个值的集合。其中,“一个值”的集合是一种基于 IList 列表接口派生的集合,“一个键和一个值”的集合是一种基于IDictionary字典接口的集合,“一个键和多个值”的集合是 NameValueCollection 类。,11,集合类的选择(续),(5)是否需要用与输入元素方式不同的方式对元素排序。Hashtable 按其元素的哈希代码对元素排序,SortedList以及 SortedDictionary根据 IComparer 实现按键对元素的排序,而ArrayList提供 Sort 排序方法。(6)是否需要信息的快速搜索和检索,对于小集合(10个元素或更少),ListDictionary 比 Hashtable 快,SortedDictionary 泛型类提供比 Dictionary 泛型类更快的查找。(7)是否需要只接受字符串的集合,如StringCollection和 StringDictionary等。,12,三、集合的创建与操作,1.动态数组类ArrayList2.队列Queue3.栈Stack4.哈希表Hashtable5.字符串字典StringDictionary,1.动态数组类ArrayList,ArrayList:可以看作是能够自动增长容量的动态数组,它实现了IList接口。(1)Capacity 集合容量,读写属性(2)Count 获取列表中实际包含元素的个数(3)Add()方法:列表末尾添加元素(4)Insert()方法:列表指定位置添加元素(5)Remove()方法:移除特定对象(6)RemoveAt()方法:根据索引值移除对象,14,1.动态数组类ArrayList,(1)ArrayList与Array的区别Array 的大小是固定的,而 ArrayList的大小可根据需要自动扩充;在Array中一次只能获取或设置一个元素的值,而在ArrayList中允许添加、插入或移除某一范围的元素;Array 的下限可以自定义,而ArrayList的下限始终为零;Array 可以具有多个维度,而 ArrayList始终只是一维的;Array 位于 System 命名空间中,ArrayList 位于 System.Collections 命名空间中。(2)创建动态数组:ArrayList 列表对象名=new ArrayList();例如,ArrayList list=new ArrayList();list.Add(罗福强);list.Add(30);,15,2.队列Queue,队列的特点一种先进先出的数据结构,当插入或删除对象时,对象从队列的一端插入,从另外一端移除 创建队列对象 Queue 队列名=new Queue(队列长度,增长因子);说明,队列长度默认为32,增长因子默认为2.0(即每当队列容量不足时,队列长度调整为原来的2倍)注意,由于调整队列的大小需要付出一定的性能代价,因此建议在构造队列时指定队列的长度。队列包括Enqueue、Dequeue、Peek、Clear和Contains等方法。其中,Enqueue和Dequeue每操作一次只能添加或删除一个数据。例如:Queue q=new Queue(50,3.0);q.Enqueue(董涛);q.Enqueue(徐磊);,16,3.栈Stack,栈的特点:一种先进后出的数据结构,这种数据结构在插入或删除对象时,只能在栈顶插入或删除。创建栈对象:Stack 栈名=new Stack();栈包括Push、Pop、Peek、Clear和Contain等方法。其中,Push和Pop每操作一次只能添加或删除一个数据。例如:Stack s=new Stack();s.Push(成都);s.Push(四川);,17,4.哈希表Hashtable,哈希表又称散列表,表示键/值对的集合。哈希表的特点:在保存集合元素时,首先要根据键自动计算哈希代码,以确定该元素的保存位置,再把元素的值放入相应位置所指向的存储桶中。查找时,再次通过键所对应的哈希代码到特定存储桶中搜索。创建哈希表对象Hashtable 哈希表名=new Hashtable(哈希表长度,增长因子);说明,默认长度为0,默认增长因子为1.0哈希表包括Add、Remove、Clear和Contains等方法。其中,Add方法需要两个参数,一个是键,一个是值;Remove方法只需要一个键名参数。例如:Hashtable h=new Hashtable();h.Add(1001,李天军);h.Add(1002,张凯);,18,5.字符串字典StringDictionary,字符串字典StringDictionary是一种把键和值强类型化为字符串而不是对象的哈希表。其中,键不能为null,且不区分大小写。例如:StringDictionary myCol=new StringDictionary();myCol.Add(姓名,罗福强);myCol.Add(性别,男);foreach(DictionaryEntry de in myCol)Console.WriteLine(0t 1n,de.Key,de.Value);,6.2 索引器,6.2.1 索引器的定义与使用 6.2.2 索引器与属性的比较,返回,6.2.1 索引器的定义与使用,1索引器的定义C#中的类成员可以是任意类型,包括数组或集合。当一个类包含了数组或集合成员时,索引器将大大简化对数组或集合成员的存取操作。,6.2.1 索引器的定义与使用,定义索引器的方式与定义属性有些类似,其一般形式如下 修饰符 数据类型 this索引类型 index get/获得属性 set/设置属性,class Album/定义一个相册类 Photo photos;/该数组用于存放照片 public Photo thisint index/带有 int参数的Photo读/写索引器 get if(index=photos.Length)return null;return photosindex;/对于有效索引,返回请求的照片 set if(index=photos.Length)return;photosindex=value;,6.2.1 索引器的定义与使用,2索引器的使用通过索引器可以存取类的实例的数组成员,操作方法与数组相似,一般形式如下:对象名索引其中,索引的数据类型必须与索引器的索引类型相同。【实例6-3】利用前面定义的索引器进行照片的添加和查询,6.2.1 索引器的定义与使用,3接口中的索引器在接口中也可以声明索引器,接口索引器与类索引器的区别有两个:一是接口索引器不使用修饰符;二是接口索引器只包含访问器get或set,没有实现语句。访问器的用途是指示索引器是可读写、只读还是只写的,如果是可读写的,访问器get和set均不能省略;如果是只读的,省略set访问器;如果是只写的,省略get访问器。例如:public interface IAddress string thisint index get;set;/声明索引器 string Address get;set;/声明属性 string Answer();/声明方法,6.2.2 索引器与属性的比较,索引器与属性都是类的成员,语法上非常类似。索引器一般用在自定义的集合类中,通过使用索引器来操作集合对象就如同使用数组一样简单;而属性可用于任何自定义类,它增强了类的字段成员的灵活性。,6.3 泛型,6.3.1 泛型概述6.3.2 泛型集合6.3.3 泛型类、泛型方法和泛型接口,返回,26,1.什么是泛型,泛型是通过“参数化类型”来实现在同一则代码中操作多种数据类型。泛型类型是一种编程范式,它利用“参数化类型”将类抽象化,从而实现更为灵活的复用。泛型赋予了代码更强的安全性、更好的复用、更高的效率和更清晰的约束,6.3.泛型方法的例子,void Swap(ref T t1,ref T t2)T temp=t1;t1=t2;t2=temp;,Int Max(ref int t1,ref int t2)int temp=t1;t1=t2;t2=temp;,int a=3,b=5;Swap(ref a,ref b);,string a=“12”,b=“xy”;Swap(ref a,ref b);,int a=3,b=5;Swap(ref a,ref b);,28,2.为什么要引入泛型,通常在讨论数组时都需要预设一个前提,即到底要解决的是整数、小数、还是字符串的运算问题。因此,在使用数组时需要首先确定数组的类型,然后再把相同类型的数据放入数组中。例如,把100个整数存入数组中,得到一个整型数组,而把100个自定义的Student对象存入数组中,得到一个对象型或Student型数组。利用数组来管理数据,虽然直观、容易理解,但存在很大的局限性,仍然需要重复编写几乎完全相同的代码来完成排序和查找操作。为此,C#提供了一种更加抽象的数据类型泛型,以克服数组的不足。当利用泛型来声明这样一个更抽象的数据类型之后,再也不需要针对诸如整数、小数、字符、字符串等数据重复编写几乎完全相同的代码。具体思路如下:首先声明这种泛型数据类型,声明时不用指定要处理的数据的类型,只讨论抽象的数据操作,如排序、查找等。在实际引用这种泛型数据类型时,先确定要处理的数据类型,再执行相应的操作。因此,泛型是一种“泛泛而谈”的数据类型。,泛型类、泛型方法和泛型接口,1泛型类当一个类的操作不针对特定或具体的数据类型时,可把这个类声明为泛型类。泛型类最常用于集合,如链接列表、哈希表、堆栈、队列和树等。一般情况下,创建泛型类的过程为:从一个现有的具体类开始,逐一将每个类型更改为类型参数,一直达到通用化和可用性的最佳平衡。定义泛型类的一般形式如下:访问修饰符 class 泛型类名:基类或接口 类型参数约束/类的成员,6.3.3 泛型类、泛型方法和泛型接口,其中,“访问修饰符”包括public、protected和internal等,“类型参数列表”不指定数据类型,当具有多个类型参数时使用逗号分隔。泛型类可以从基泛型类派生,也可以从泛型接口派生,当所声明的泛型类不是派生类时,省略基类和接口。“类型参数约束”用来限定泛型类所要处理的数据类型。,6.3.3 泛型类,在C#中,一共有5类约束,分别如下:(1)where T:struct:类型参数必须是值类型。(2)where T:class:类型参数必须是引用类型,包括任何类、接口、委托或数组类型(3)where T:new():类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new()约束必须最后指定。(4)where T::类型参数必须是指定的基类或派生自指定的基类。(5)where T::类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。,6.3.3 泛型类,【实例6-4】泛型类的定义和使用演示。,6.3.3 泛型方法,2泛型方法泛型方法是在泛型类或泛型接口中使用类型参数声明的方法。其一般形式如下:访问修饰符 返回值类型 方法名(形式参数列表)/语句 其中,类型参数列表与其所属的泛型类的类型参数列表相同。,6.3.泛型方法,T Max(T t1,T t2)if(t1t2)return t1;return t2;,int Max(int t1,int t2)if(t1t2)return t1;return t2;,int a=3,b=5;?Max(a,b);,string a=“12”,b=“xy”;?Max(a,b);,int a=3,b=5;?Max(a,b);,Comparable(T,T)?operator,6.3.3 泛型接口,C#允许自定义泛型接口,一般形式如下:访问修饰符 interface 接口名/接口成员 其中,访问修饰符可省略,“类型参数列表”表示尚未确定的数据类型,类似于方法中的形参列表,当具有多个类型参数时使用逗号分隔,泛型接口也可以使用类型约束。,public interface IComparable int CompareTo(T t);,public interface IComparer int Compare(T t1,T t2);,2023/7/5,36,publicclassmyCompare:IcomparerintCompare(T t1,T t2)/不区分大小写的比较器 return(newCaseInsensitiveComparer().Compare(t1,t2);T Max(T t1,T t2)T max;if(Compare(t1,t2)0)max=t1;else max=t2;return max;,2023/7/5,37,Class Over,Thank you!,

    注意事项

    本文(C#程序设计经典教程.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开