1、单元4 C#进阶编程 知识目标 v(1)掌握结构化的异常处理机制;v(2)深刻理解委托和事件;v(3)掌握枚举和结构;v(4)掌握字符串的常用方法;v(5)掌握正则表达式的基本用法;v(6)掌握常用的集合类和泛型集合类。能力目标v(1)能够捕获并处理异常;v(2)能使用枚举或结构描述数据;v(3)能对文本进行较为复杂的处理;v(4)能使用正则表达式实现文本的验证;v(5)能定义和使用委托类型;v(6)能给对象添加事件并能处理事件;v(7)能使用集合类存储数据,能编写基于栈、队列、链表、哈希表等数据结构的程序。教学任务v任务1 异常处理v任务2 枚举和结构v任务3 委托和事件v任务4 字符串与正
2、则表达式v任务5 泛型和集合单元4 C#进阶编程任务5 泛型和集合引例v实现简单迷宫。寻找一条从入口到出口的通路。知识储备v知识点1:非泛型集合。v知识点2:泛型概述。v知识点3:泛型集合。集合概述v如果对象可以提供对相关对象的引用,那么它就是一个集合,它可以遍历集合中的每个数据项;v专业的说法是所有实现了System.Collections.IEnumerable接口的类的对象都是集合。v数据集合类都位于System.Collections命名空间中。知识点1:非泛型集合v常用集合类型1.ArrayList类2.Stack类3.Queue类4.Hashtable类集合优点v数组Array是固
3、定大小的,不能伸缩;而集合却是可变长的。v数组要声明元素的类型,集合类的元素类型却是object。v数组可读可写不能声明只读数组。集合类可以提供ReadOnly方法以只读方式使用集合。集合属性v修改或者获取ArrayList的容量v使用Capacity属性,通过设置该属性的值可以修改ArrayList的容量;读取该属性的值可以获取ArrayList的容量v当为ArrayList对象添加的数据元素的个数超出初始化时指定的数据项个数时,ArrayList对象的容量还可以自动增长默认增长后的容量为原来的2倍,即数据项的个数为初始化时的2倍。ArrayList常用的属性和方法如下表所示属性属性说明说明
4、Capacity获取或设置集合可包含的元素数Count获取集合中实际包含的元素数方法方法说明Add将元素添加到集合的结尾处Clear从集合中移除所有元素CopyTo将ArrayList或它的一部分复制到一维数组中Insert将元素插入到集合的指定索引处Remove从集合中移除特定值的第一个匹配项RemoveAt移除集合中指定索引处的元素Reverse将集合中元素的顺序反转Sort将集合或集合的一部分进行排序【例4-7】歌唱比赛计分器。从键盘输入评委打出的分数,去掉一个最高分和一个最低分,显示平均分。class Score ArrayList al=new ArrayList();public
5、void AddMark()int i=0;while(true)Console.WriteLine(请输入评为分数,以-1结束);i=int.Parse(Console.ReadLine();if(i!=-1)al.Add(i);else break;public void Del()if(al.Count 2)al.Sort();al.RemoveAt(0);al.RemoveAt(al.Count-1);public double Average()double sum=0;foreach(int i in al)sum+=i;return sum/al.Count;class Prog
6、ram static void Main(string args)Score s=new Score();s.AddMark();s.Del();Console.WriteLine(平均分是0,s.Average();Console.ReadKey();Queue类vQueue是先进先出的集合类,也成为队列。队列的特性是一端进,一端出,即先进入队列的元素将会先从出口出来。队列一般有入队和出队的操作,队列,先进先出。Enqueue方法入队列,Dequeue方法出队列。class Program static void Main(string args)Queue q=new Queue();Co
7、nsole.WriteLine(入队前,队列的大小0,q.Count);q.Enqueue(0001);q.Enqueue(洗发水);q.Enqueue(15);Console.WriteLine(入队后,队列的大小0,q.Count);q.Dequeue();Console.WriteLine(出对后,队列的大小0,q.Count);foreach(object item in q)Console.WriteLine(队列中的元素0,item);Console.ReadKey();Stack类v栈,后进先出。Push方法入栈,Pop方法出栈。Stack是又一重要的集合类,它的功能与Queue
8、相似,但也有不同。它的特点是后进先出,即最后进入的元素会最先出来。堆栈一般有进栈和出栈的操作。【例4-8】实现数值进制的转换。class Program static string Convert(int i,int j)if(i 16)return 只能将十进制转化为二到十六进制;Stack stack=new Stack();do int k=i%j;char c=(k 0)s+=stack.Pop().ToString();return s;static void Main(string args)Console.WriteLine(请输入一个十进制数:);int i=int.Parse
9、(Console.ReadLine();Console.WriteLine(请输入要转换的进制:);int j=int.Parse(Console.ReadLine();Console.WriteLine(Convert(i,j);Console.ReadKey();HashTable类vHashTable翻译为哈希表,表示键(key)/值(value)对的集合,这些键/值对根据键的哈希代码进行组织,每一个元素都是一个存储在字典实体对象中的键/值对。HashTable像一个字典,根据键可以找到相应的值。哈希表提供了添加元素和访问元素等方法,哈希表,名-值对。class Program stat
10、ic void Main(string args)Hashtable h=new Hashtable(3);h.Add(1,0001);h.Add(2,洗发水);h.Add(decimal,15);foreach(DictionaryEntry item in h)Console.WriteLine(0 1,item.Key,item.Value);h.Remove(decimal);Console.WriteLine(n删除后的哈希表);foreach(DictionaryEntry item in h)Console.WriteLine(0 1,item.Key,item.Value);C
11、onsole.ReadKey();知识点2:泛型概述v所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型,泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。vC#泛型赋予了代码更强的类型安全,更好的复用,更高的效率,更清晰的约束。泛型v泛型,是指定类型的集合,是通过参数化类型来实现在同一份代码上操作多种数据的类型。泛型是在C#2.0引入的。泛型的字面意思是具有在多种数据类型上皆可操作,与模板有些相似。泛型引入了类型参数化的概念,能够实现定义的泛型类和方法将一个或多个类型的指定,推迟到客户端代码声明并实例化该类或方法的时候。在编写其他客户端代码时使用的
12、单个类,不会引入运行时强制转换或装箱操作的成本或风险。只要提供数据类型就能使用这些强有力的数据结构。泛型的特点如果实例化泛型类型的参数相同,那么JIT编译器会重复使用该类型。C#的泛型类型可以应用于强大的反射技术。泛型无需类型的转换操作,减少了装箱和拆箱的操作,性能提高。泛型类型的声明不仅可单独声明,也可在基类中包含泛型类型的声明。使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能。泛型最常见的用途是创建集合类。.NET 2.0的System.Collections.Generics 命名空间包含了泛型集合定义。各种不同的集合/容器类都被“参数化”了。为使用它们,只需简单地指定参数
13、化的类型即可。常用泛型格式v编程时需要引入System.Collection.Generic名称空间,最为常用的有以下两个:vList T类型对象的集合。使用方法与ArrayList类似,但它不仅比ArrayList更安全,而且明显地更加快速。vDictionary V类型的项与K类型的键值相关的集合,可以理解Dictionary 是 Hashtable的泛型版本。知识点3:泛型集合v创建T类型对象的泛型集合语法为:vList 泛型对象名=new List();v添加泛型List的数据项Add():向列表尾部添加,输入参数为T类型数据AddRange():向列表尾部添加,输入参数为T类型对象组
14、Insert():向指定位置添加,输入数据为位置索引和要添加的对象(T类型)示例:类型安全的泛型列表在上例中,我们编写了一个泛型的列表的例子,在尖括号内指定参数类型为int。该代码的执行将产生结果“Total is 7”。现在,如果去掉语句doubleList.Add(5.0)的注释,将得到一个编译错误。编译器指出它不能发送值5.0到方法Add(),因为该方法仅接受int型。不同于前例,这里的代码实现了类型安全。List aList=new List();aList.Add(3);aList.Add(4);/aList.Add(5.0);int total=0;foreach(int val
15、in aList)total=total+val;Console.WriteLine(Total is 0,total);示例:创建一个泛型类 public class MyListprivate static int objCount=0;public MyList()objCount+;public int Countgetreturn objCount;class SampleClass class Programstatic void Main(string args)MyList myIntList=new MyList();MyList myIntList2=new MyList(
16、);MyList myDoubleList=new MyList();MyList mySampleList=new MyList();Console.WriteLine(myIntList.Count);/输出2Console.WriteLine(myIntList2.Count);/输出2Console.WriteLine(myDoubleList.Count);/输出1Console.WriteLine(mySampleList.Count);/输出1Console.WriteLine(new MyList().Count);/输出2Console.ReadLine();【例4-9】编程
17、判断一个字符串是否是回文。回文是指一个字符序列以中间字符为基准两边字符完全相同,如字符序列“ACBDEDBCA”是回文v算法思想:判断一个字符序列是否是回文,就是把第一个字符与最后一个字符相比较,第二个字符与倒数第二个字符比较,依次类推,第i个字符与第n-i个字符比较。如果每次比较都相等,则为回文,如果某次比较不相等,就不是回文。因此,可以把字符序列分别入队列和栈,然后逐个出队列和出栈并比较出队列的字符和出栈的字符是否相等,若全部相等则该字符序列就是回文,否则就不是回文。class Program static void Main(string args)Stack s=new Stack(5
18、0);Queue q=new Queue(50);string str=Console.ReadLine();for(int i=0;i str.Length;+i)s.Push(stri);q.Enqueue(stri);while(s.Count!=0&q.Count!=0)if(s.Pop()!=q.Dequeue()break;if(s.Count!=0|q.Count!=0)Console.WriteLine(这不是回文!);else Console.WriteLine(这是回文!);Console.ReadKey();泛型集合Dictionaryv泛型集合Dictionary存储数
19、据的方式和哈希表类似,通过键/值对来保存数据。它具有泛型的全部特征,编译的时候就检查类型约束,获取元素的时候无须类型转换。定义语法如下:vDictionary t=new Dictionary();v泛型提供了很好的类型安全策略,添加、删除、遍历等操作和HashTable是类似的。27引例分析与实现简单迷宫实现v迷宫问题迷宫问题:寻找一条从入口到出口的通路。寻找一条从入口到出口的通路。8123456781234567入口入口出口出口前进方向:前进方向:上上(北北)、下、下(南南)、左、左(西西)、右、右(东东)东东南南北北西西28栈栈v迷宫问题迷宫问题8123456781234567(1,1)
20、i(2,1)i(3,1)i(4,1)i(5,1)i(6,1)(7,1)i引例分析29栈栈8123456781234567(1,1)i(2,1)i(3,1)i(4,1)i(5,1)i(6,1)(7,1)i (5,2)i(5,3)i(6,3)(6,3)i(6,4)(6,4)i(8,8)iiiiii引例分析v迷宫问题迷宫问题引例实现/*向下(南)访问*/static bool stepdown(int i,int j)i+;if(i=8)return false;if(ai,j=0)return true;return false;/*向右(东)访问*/static bool stepright(i
21、nt i,int j)j+;if(j=8)return false;if(ai,j=0 )return true;return false;/*向上(北)访问*/static bool stepup(int i,int j)i-;if(i 0)return false;if(ai,j=0)return true;return false;/*向左(西)访问*/static bool stepleft(int i,int j)j-;if(j 0)return false;if(ai,j=0)return true;return false;static void migong(Stack s)i
22、nt i=0,j=0,x;while(true)if(ai,j=0)s.Push(i+1)*10+j+1);ai,j=1;if(s.Peek()=88)return;if(stepdown(i,j)i+;else if(stepright(i,j)j+;else if(stepup(i,j)i-;else if(stepleft(i,j)j-;else s.Pop();x=s.Peek();i=x/10-1;j=x%10-1;static int,a=0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,1,
23、0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,1,0,1,1,0,1,1,0,0,0,0,0,0;static void Main(string args)Stack s1=new Stack();Stack s2=new Stack();int x=0,n=0;migong(s1);while(s1.Count!=0)s2.Push(s1.Pop();while(s2.Count!=0)x=s2.Pop();Console.Write(0,1 ,x/10,x%10);if(+n%5=0)Console.WriteLine(n);Console.ReadKey();归纳总结v知识要点:v(1)Array、ArrayList、Hashtable、Stack、Queue类;v(2)泛型类;v(3)泛型List集合,泛型哈希表,泛型队列,泛型栈。拓展实践v创建简单学生管理系统。
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。