第5章字符串、集合和泛型.ppt

上传人:本田雅阁 文档编号:3430956 上传时间:2019-08-24 格式:PPT 页数:52 大小:218.04KB
返回 下载 相关 举报
第5章字符串、集合和泛型.ppt_第1页
第1页 / 共52页
第5章字符串、集合和泛型.ppt_第2页
第2页 / 共52页
第5章字符串、集合和泛型.ppt_第3页
第3页 / 共52页
第5章字符串、集合和泛型.ppt_第4页
第4页 / 共52页
第5章字符串、集合和泛型.ppt_第5页
第5页 / 共52页
点击查看更多>>
资源描述

《第5章字符串、集合和泛型.ppt》由会员分享,可在线阅读,更多相关《第5章字符串、集合和泛型.ppt(52页珍藏版)》请在三一文库上搜索。

1、1,第五章 字符串、集合和泛型,5.1 字符串 5.2 集合和泛型 5.3 小结,5.1 字符串,5.1.1String类 5.1.2StringBuilder类,5.1 字符串,在C# 语言中,String是 .NET Framework 中System.String的别名,System.String类型表示的是Unicode字符的字符串。,String类,任何应用程序中使用最频繁的类型无疑是System.String类型。一个String类型表示一个恒定不变的字符序列集合。String类型直接继承自Object,这使得它成为一个引用类型。此外,String类还实现了字符串的一些基本操作,如

2、字符串和其他数据类型的转换,字符串的格式化,字符串(字符)大小写的转换,字符串比较,字符串的剪裁和填充,字符串的拆分和连接。下面分类介绍了String类实现这些操作的方法:,String类,1. 字符串分析(Parse) Parse方法把表示 .NET Framework 数字基类型的字符串转换成实际的 .NET Framework 数字基类型。 Parse方法最多能接受3个参数: 要转换的字符串; System.Globalization.NumberStyles枚举中的一个或多个值; NumberFormatInfo类。 因为Parse方法假设所有的字符串输入都是表示十进制的值,所以不能解

3、析非十进制的值。Parse方法同样也不能解析那些表示NaN(非数字)、Single和Double类的PositiveInfinity或NegativeInfinity值的字符串,因为它们都不是真正的数字。,String类,【例5.1】把一个字符串转换成一个int类型的值,对该数值执行递增操作,并显示输出结果。 /Parse:把字符串转换成数字 string sr=“12345“; int a=int.Parse(sr); a+; Response.Write(“parse:“+Convert.ToString(a)+“);,String类,2. 格式化 .NET Framework 提供了许多

4、格式字符串和说明符,可以用它们来格式化从其他对象派生而来的字符串的外观。 在向用户显示基本数据类型的值之前,把它们转换成字符串类型有许多好处:字符串容易显示,而且可以将它们添加到应用程序的对话框和消息框中;也可以使用格式说明符将同一数值以科学计数法格式、货币格式、十六进制格式或其他格式显示出来。,String类,1)何时使用格式字符串 对于应用程序存储信息的格式,当它被应用程序所使用时,可以使用格式说明符。 例如,一个商务应用程序可能在DateTime对象中保存当前的时间和日期,以便在交易结束时进行记录。DateTime对象存储了一些用户没有必要关心的信息,如从创建对象起用了多少毫秒,可以使用

5、格式说明符来显示用户关心的信息,如交易的日期和时间。 另外,还可以动态地修改由格式说明符创建的字符串,来表示当前区域的货币、日期和时间。例如,应用程序可以使用用户当前区域特有的符号来显示日期和时间。,String类,2)使用格式字符串的方法 任何能够创建字符串的方法都可以使用格式字符串,所创建的字符串可以代表 .NET Framework 中的某种数据类型,如Int32、Int64、Single、Double、Enumeration和DateTime等。格式字符串还可以用于Console.WriteLine方法、String.Format方法以及System.IO命名空间中的一些方法。 另外,

6、每个基本数据类型都包含一个ToString方法,这个方法返回一个该数据类型值的字符串表示形式,并可接受一个字符串格式说明符作为参数。可以使用 .NET Framework 中定义的几个格式字符串中的一个来控制上面那些创建的字符串的布局和设计。,String类,3)使用ToString方法 当要把标准的 .NET Framework 数据类型转换成字符串(以其他形式表示该类型)时,ToString方法将非常有用。 如果有一个整数100,想把它表示成货币的形式呈现给用户,使用ToString方法和货币格式字符串(C)就可以很容易地生成字符串$100.00。该数据类型的原始值并不会被转换,只是返回一

7、个代表结果的新字符串。除非将这个新的字符串转换为原来的 .NET 基本数据类型,否则它不能用于计算。而该数据类型的原始值在任何时候都能参与计算。,String类,【例5.2】ToString方法将数值100以货币格式的字符串形式显示在页面窗口中。 /ToString:把framework中的标准数据类型转换成字符串 int i=10; string j=i.ToString(“c“);/c表示货币格式字符串 Response.Write(“格式化“+j+“); DateTime d=new DateTime(2006,9,23,10,20,30);/格式化日期,分别以短日期和长日期的形式显示

8、string t=d.ToString(“d“); Response.Write(“短日期“+t+“); string t1=d.ToString(“f“); Response.Write(“长日期“+t1+“);,String类,3. 改变大小写 String.ToUpper和String.ToLower方法提供了接受区域性参数的重写方法。String.ToUpper方法把字符串中所有字符转换成大写形式,String.ToLower方法是把字符串中所有字符转换成小写形式。 【例5.3】大小写转换实例。 string da=“HelloWorld“; Response.Write(“转换成大写

9、“+da.ToUpper()+“);/大小写转换 Response.Write(“转换成小写“+da.ToLower()+“);,String类,4. 字符串比较 .NET Framework 提供了几个方法来比较字符串的值。表5.1描述了一些比较字符串值的方法。 表5.1 字符串比较,String类,例如,String.Compare方法提供了全面的方法来比较当前字符串对象和另一个字符串对象。可以用这个方法来比较两个字符串或它们的子串。 另外,还提供了考虑或忽略大小写规则和区域性差异的重载方法。 表5.2 字符串比较返回结果,String类,【例5.4】使用Compare方法来判断两个字符串

10、是否相同。 int ii=String.Compare(t,t1);/compare用于比较两个字符串的值,返回一个整型值 Response.Write(“字符串比较“+Convert.ToString(ii)+“); 5. Trim 和Pad 当需要移除或添加字符串首尾的空格时,System.String类提供了剪裁和填充字符串的方法。,String类,1)剪裁 如果将句子解析成独立的单词,可能在单词的首尾都有空格,可以使用System.String类的Trim方法移除该字符串首尾的任意数量的空格。表5.3 描述了两个可用的剪裁方法。 表5.3 字符串剪裁,String类,【例5.5】使用S

11、tring.Trim方法可以很容易地移除字符串首尾的空格,如下所示: /trim的用法 string aa=“ hello “; Response.Write(“Trim: “+aa.Trim()+“); /remove:从字符串指定索引位置移除指定数目的字符 string b=“12345“; Response.Write(“remove: “+b.Remove(2,3)+“);,String类,2)填充 System.String也提供了为现有字符串创建新版本的方法,它是通过扩展一定数量的字符实现的。表5.4描述了可用的填充方法。 表5.4 字符串填充方法,String类,【例5.6】St

12、ring.PadLeft方法创建一个新的字符串,该方法把字符串向右移动,使该字符串从第一个字符到最后一个字符的长度正好为指定的数目。如果没有使用重写方法来指定自定义填充字符时,那么就会插入空格。 /padleft右对齐并左填充,此程序中字符串总长度为5 string c=“hello“; Response.Write(“padleft: “+c.PadLeft(10,-)+“);,String类,6. Split和Join System.String类提供了用来拆分字符串的Split方法以及用来连接字符串的Join方法。 1)Split方法 Split方法把字符串实例分解成由其子串组成的字符串

13、数组,分解的位置由分隔符指定。若不指定分隔符,即参数为null时,则假定分隔符为空格。如果分隔符字符串是一个零长度的字符串,那么将返回包含该字符串整个表达式的单元素数组。 【例5.7】拆分字符串实例。 /split:将字符串拆分成字符串数组,分解位置由分隔符指定 string dd=“hello world“; string f=dd.Split(null);/分隔符是null,即空格 Response.Write(“拆分字符串:“+f1+“);,String类,2)Join方法 Join方法用指定的分隔符把特定的String数组的各元素连接起来,产生单个连接的字符串。如果不指定分隔符,也就是

14、说分隔符为null时,那么就使用空白字符(” ”)作为分隔符。如果分隔符是零长度的字符串(”),那么数组中的所有元素不使用分隔符直接连接在一起。,StringBuilder 类,String对象是不可变的,因此,每次使用System.String类中的方法时,都将创建新的字符串对象。当反复修改字符串时,创建新的String对象带来的开销将会非常大。可供选择的方法是使用Sytem.Text.StringBuilder类来修改字符串,这样可以避免创建新的字符串对象。,StringBuilder 类,1. 创建StringBuilder对象 通过使用一个重载的StringBuilder类的构造函数来

15、初始化变量,就可以创建该类的一个新实例,正如下面的代码示例所阐释的那样。 StringBuilder s=new StringBuilder(“hello“); 尽管StringBuilder对象是一个动态对象,允许向其所封装的字符串中添加字符,但是也可以指定其所包含的字符数目的最大值。这个值称为StrngBuilder对象的容量。 注意:不要将它与当前StringBuilder对象容纳的字符串长度相混淆。任何扩展StringBuilder对象的长度而使其超出了该对象最大范围的行为,都会引发ArgumengOutOfRangeException异常。,StringBuilder 类,2. St

16、ringBuilder方法 表5.5描述了可以用来修改StirngBuilder对象内容的一些方法。 表 5.5 StirngBuilder对象内容修改,StringBuilder 类,【例5.8】StringBuilder.Append和StringBuilder.Insert的使用方法示例。 /StringBuilder类的用法 s.Append(“!“); Response.Write(s+“); s.Insert(2,“-“);/在第2个字符处插入一字符串 Response.Write(s);,5.2 集合和泛型,5.2.1 集合和集合接口 5.2.2 使用主要集合类型 5.2.3 使

17、用泛型集合 5.2.4 使用专用集合,5.2 集合和泛型,通过使用集合,可以将许多对象存储在一个对象中。 .NET Framework 2.0引入了泛型集合和集合基类。这些新的集合类提供了增强的功能,因此可以更高效地使用它们来创建自己的集合类型。,集合和集合接口,假设正在开发一个雇员跟踪应用程序。这个应用程序使用一个名为Employee的数据结构来存储雇员信息;然而,并不能预知需要的记录数目。虽然可以将该数据结构存储在数组中,但是如果这样做,就需要编写代码来处理添加新员工的情况:首先,需要创建一个新数组,该数组需要具有容纳附加元素的空间;然后,需要将元素从原始数组复制到新数组并添加新元素。要简

18、化这个过程, .NET Framework 提供了一组类,这些类就是集合。 集合是指通过高度结构化的方式存储任意对象的类。与无法动态调整大小的数组相比,集合不仅能随意调整大小,而且对存储和检索存储在其中的对象提供了更高级的方法。通常可以在 .NET Framework 的System.Collections命名空间中找到通用的集合; .NET Framework 2.0 引入了泛型集合,通过泛型集合可以重用相同的代码。,集合和集合接口,每个集合接口中都定义了不同的行为。例如,Ilist接口使集合的行为类似列表并对其进行索引,IDictionary接口使集合行为类似字典,其中的项可通过键来检索。

19、每个集合类(非泛型或泛型)都实现了一个或多个集合接口。还可以在自定义的集合类中实现一个或多个集合接口,以支持特殊需要。 下面描述了各种集合接口的非泛型和泛型版本。这些接口的非泛型版本位于System.Collections命名空间,泛型版本位于System.Collections.Generic命名空间。,集合和集合接口,1. IComparable 使用IComparable接口来比较两个对象并确定哪个对象较大。IComparable接口的CompareTo方法接受一个对象作为参数。如果当前对象的值大于、等于或小于参数对象的值,则该方法分别返回1、0、-1。因为IComparable接口的泛

20、型版本所能接受的参数是 .NET所能接受的特定类型的,故该接口保证了类型安全。,集合和集合接口,2. ICollection ICollection接口定义所有非泛型和泛型集合的大小、枚举数和同步方法。该接口的非泛型版本提供了AddAt、AddItem、GetEnumerator和Item方法,使用这些方法可以分别执行以下操作:将声明为System.Object的项添加到特定位置、将项添加到集合结尾、对集合进行枚举以及使用集合中的某个项。ICollection接口的非泛型版本还提供IsReadOnly和Count属性,指示集合是否为只读以及返回包含在集合中的元素数目。该接口的泛型版本提供Add

21、、Clear、Contains、CopyTo和Remove方法,使用这些方法可以分别执行以下操作:添加一个声明为特定数据类型的项、删除集合中的所有项、搜索特定项、将集合复制到特定数据类型的数组以及从集合删除某个特定项。ICollection接口的泛型版本还提供了Count属性,该属性返回ICollection中包含的元素数目。,集合和集合接口,3. IList 使用IList接口可以对集合进行索引,通过使用该索引,将能更简便地添加或删除集合中特定位置的项。IList接口的非泛型和泛型版本都提供Insert、IndexOf和RemoveAt方法,可以在特定索引处插入项、查找现有项的索引以及在指定

22、其索引的情况下删除某个项。Ilist接口的非泛型版本提供Add、Clear、Contains、IndexOf、Insert、Remove和RemoveAt方法,这些方法的行为是:添加项、删除所有现有项、搜索特定项、查找现有项的索引、在特定索引处插入项以及在知道其索引的情况下删除某个项。,集合和集合接口,4. IComparer 非泛型IComparer接口提供Compare方法,该方法接受两个System.Object类型的参数并返回1、0、-1,以表明第1个参数是大于、等于还是小于第2个参数。因此,可以使用此接口以对集合进行排序。在IComparer接口的泛型版本中,两个参数都作为特定数据类

23、型传递。 5. IEqualityComparer 使用IEqualityComparer接口来检查两个集合是否等价。非泛型IEqualityComparer接口提供两个方法,Equals和GetHashCode,Equals方法接受两个定义为System.Object的参数,并且如果它们相等,该方法返回true;如果两个集合相等,则GetHashCode方法返回相同的哈希代码。,集合和集合接口,6. IDictionary 非泛型IDictionary接口提供集合键/值对行为。键标识集合中的项,而值是存储在集合中的实际对象。IDictionary接口的泛型版本允许将键和值声明为特定数据类型。

24、 7. IEnumerable IEnumerable接口提供GetEnumerator方法,对集合进行枚举,返回IEnumerator数据类型。IEnumerable接口支持迭代,并且必须通过使用C# 中的foreach语句来使用迭代功能。,集合和集合接口,8. IEnumerator 非泛型IEnumerator接口支持在非泛型集合中进行简单迭代,此接口是所有非泛型枚举数的基接口。IEnumerator接口的非泛型版本提供MoveNext和Reset方法,分别将枚举数向前移动到集合中的下一个元素和将枚举数重置到其初始位置(即集合中第一个元素之前)。非泛型IEnumerator还提供Curr

25、ent属性,当实现该属性时,它将返回类型为System.Object的数据。IEnumerator接口的泛型版本也提供Current 属性,与非泛型版本的Current属性相类似,但在泛型版本中,该属性是强类型的。,使用主要集合类型,主要集合或非泛型集合用于存储许多不相关的类型。例如,需要创建一个库存控制应用程序来跟踪用于某种特定机动车的零件。非泛型集合(如ArrayList类)是存储这些零件的一种理想方式,尤其是需要将该集合传递给某个方法时。非泛型集合包括ArrayList 、Stack、Queue、StoredList、Hashtable、Comparer和BitArray类,每一种类都实

26、现了某种特定的功能。例如,StoredList类为其包含的项提供一种排序机制,而Stack和Queue类维持将项添加到集合和从集合中删除的顺序。需要熟悉每个集合类型的行为,这样可以使代码尽可能高效,并将编写的代码量降到最低。,使用主要集合类型,ArrayList类定义在System.Collections命名空间中,该类表示一个列表,类似于可动态调整大小的一维数组。众所周知,创建一个数组后,将无法更改数组大小。在C# 中,看似可以动态调整数组大小,但事实并不是这样。实际情况是,C# 会在内存中创建一个不同大小的新数组,并将原始数组中的所有项都复制到新数组。因此,如果打算在集合中添加或删除项,那

27、么使用数组的效率将很低。在这种情况下,应该使用ArrayList类来实现列表,创建一个引用类型的灵活的集合。,使用主要集合类型,列表中项的位置基于索引,该索引是从0开始的非负整数。例如,在具有10个对象的列表中,索引从0开始,到9结束。可以通过直接使用相应的索引或按顺序检索集合中的所有对象来从列表中检索对象,还能快速搜索存储在列表中的对象或对其进行排序。此外,列表中的每一项都是System.Object类型,十分灵活,例如,列表中可以同时包含一个整数、一个雇员对象和一个工资单对象。,使用主要集合类型,【例5.9】假设要在某个列表中存储一系列水果。要达到这个目的,首先需要创建一个ArrayLis

28、t类型的对象;然后,通过使用Add方法将所需水果的名称一一添加到该对象,并通过使用水果名称的索引检索它们。 下面是以C# 编写的执行上述操作的示例代码。 /arraylist是大小可以按需动态增加的数组 ArrayList fruit = new ArrayList(); fruit.Add(“Apple“); fruit.Add(“Pear“); fruit.Add(“Orange“); fruit.Add(“Banana“); foreach (string item in fruit) Response.Write(item+“); ,使用泛型集合,假如已经编写了一个Web应用程序,并且

29、想要在客户端访问该应用程序的Web站点时记录客户的用户ID。由于网站经常会达到很高的访问量,因此无法对点击站点的每个访问者都进行实时处理,想要将该数据作为整数存储到某个队伍中,以便在后台处理这些命令,使用泛型集合可以达到这个目的。与非泛型集合不同的是,泛型集合将数据作为特定的数据类型存储,这可以加快在集合中存储和检索数据的速度。这是因为在存储和检索元素时,不需要对值类型进行装箱或拆箱操作,或者对引用类型数据进行强制转换。,使用泛型集合,1. 使用泛型List类型创建类型安全的集合 泛型List类可看作ArrayList类的泛型版本,通过使用泛型List类型,可以创建提供ArrayList行为的

30、泛型列表。但是与ArrayList不同的是,它可以存储引用类型或值类型的数据,而ArrayList只能存储System.Object类型的数据。当创建一个泛型List类的对象时,需要指定该列表将包含元素的数据类型,这将确保泛型列表仅包含该特定类型的元素,从而不必将元素从System.Object数据类型进行装箱、拆箱和强制转换。泛型List类提供了对泛型列表的元素进行搜索、排序和操作的方法。 使用List.Enumerator结构可以枚举泛型列表的元素,该结构是非泛型IEnumerator接口的泛型等价实现。List.Enumerator通过使用Current属性和MoveNext方法来进行枚

31、举,其中Current返回当前对象,MoveNext移动到列表中的下一个元素。,使用泛型集合,【例5.10】以下代码示例说明了如何以C# 实现泛型List类。创建一个泛型List类,其中每个元素都定义为一个字符串,再向该列表添加4个元素:Michael Patten、Simon Pearson、David Pelton和Thomas Anderson,然后将它们写入页面。 /一个简单的列表 List l = new List(); l.Add(1); l.Add(2); l.Add(3); l.Remove(2); Response.Write(“列表中的数据:“);,使用泛型集合,2. 使用

32、泛型Stack集合和Queue集合 堆栈和队列提供先进先出(first in first out, FIFO)或后进先出(last in first out,,LIFO)行为。使用泛型Queue类以实现FIFO,使用泛型Stack类以实现LIFO。例如,想要在用户访问Web站点时,通过用户ID对他们进行跟踪,但是需要等待并在后台处理该信息,则可以使用泛型Queue类;如果想要跟踪用户在字处理应用程序中进行的字符串形式的更改,并且允许用户撤销每个更改,可以使用泛型Stack类。 泛型Stack类和Queue类的枚举类型分别为Stack.Enumerator和Queue.Enumerator泛型结

33、构。这些结构使用Current属性和MoveNext方法来枚举集合中的元素。MoveNext方法将Current属性设置为下一个元素。调用MoveNext方法之前Current属性得到的元素不变,当MoveNext方法越过集合尾部时,会将枚举数放置在集合中最后一个元素之后,并且MoveNext方法返回false。如果MoveNext返回false,则Current属性不确定。如果想重新进行一次枚举,必须创建一个新枚举而不是将Current属性设置为集合的第一个元素。,使用泛型集合,1)泛型Stack类 泛型Stack类的功能和非泛型Stack类相似,只不过泛型Stack类包含特定数据类型的元素

34、。泛型Stack类表示相同数据类型的对象的可变大小LIFO集合。,使用泛型集合,【例5.11】本例说明了在C# 中如何使用泛型Stack类。通过使用Push方法,向堆栈添加了5个元素。然后,通过使用Pop方法从堆栈删除并显示这些元素。通过使用Peek方法查看堆栈中的下一个项,该方法不删除堆栈中的元素。 /堆栈 Stack stack = new Stack(); stack.Push(a); stack.Push(b); stack.Push(c); stack.Pop(); Response.Write(“堆栈中的数据:“); foreach (char c in stack) Respon

35、se.Write(c); ,使用泛型集合,2)泛型Queue类 泛型Queue类与非泛型Queue类相同,只不过泛型Queue类包含特定数据类型的元素。,使用泛型集合,【例5.12】本例说明了在C# 中如何使用泛型Queue类。通过使用Enqueue方法,向队列添加了5个元素。然后通过使用Dequeue方法删除并显示这些元素。使用Peek方法查看堆栈中的下一个元素,该方法不删除队列中的项。 /队列 Queue q = new Queue(); q.Enqueue(“A“); q.Enqueue(“B“); q.Enqueue(“C“); Response.Write(“队列中的数据:“); f

36、oreach (string s in q) Response.Write(s); Response.Write(“);,使用专用集合,在开发使用集合类的应用程序时,会发现有时应用程序无法从SortedList检索某个特定对象,但用户检查SortedList集合时,发现要查找的对象就在里面。原来是因为在向集合添加特定对象时,指定的键为小写字符串,而检索相同的对象时,键为大写字符串,如果SortedList不区分大小写,将不存在这个问题。此外,由于该应用程序中的集合具有字符串形式的键,因此需要创建目标类型为字符串的泛型List集合,以确保该集合提供类型安全。是否有特殊集合可以达到这个目的呢?可以

37、通过使用System.Collections.Specialized命名空间中的专用集合来满足此类要求。,使用专用集合,专用集合是预定义集合,用于特殊或专用性很强的场合。这些集合位于System.Collections.Specialized命名空间并且被看作是泛型集合的扩展。要想了解 .NET Framework 为什么提供这些集合,可考虑表5.6中列出的这些专用集合并思考将如何做到以下几点: 通过使用与Hashtable类相似的键/值对来实现一个小型集合,以存放最多10个元素,希望该集合具有极其出色的性能; 实现类型安全的ArrayList类存放字符串值,并为其提供适当的枚举数,达到此目的

38、的一种方法是通过将泛型集合的类型指定为字符串; 根据键/值对或使用索引位置来访问集合的元素; 建一个不区分大小写的SortedList类。 开发人员可以通过使用某些具有特定用途的预定义集合来达到所有目的。这些预定义的特殊集合称为专用集合。,5.3小结,本章主要介绍了 .NET Framework 中的字符串和集合。字符串是软件编程过程中经常使用的一种类型,字符串的解析、格式化、操作以及比较等功能需要好好掌握。集合是一种经常使用的类型,在System.Collections和System.Collections.Generic命名空间中提供了大量的集合类型,它们提供了不同的行为。开发人员可以根据

39、实际的情况选择最适用的集合类型,还可以通过实现集合接口或从基类继承的方式,自定义集合的行为。,课后习题,1. 当重复修改字符串时,使用哪个类可以改善性能? 2. 有的类包含可被单独索引的有序对象集合,这样的类实现的接口的名字是什么?指出在System.Collections命名空间中实现了这个接口的类。 3. 通用的集合类需要对其中的元素进行运行时强制类型转换,以得到集合类中元素的真实类型。指出运行时强制类型转换产生的问题。 4. 如果放置一组餐盘,它们使用叠放的方式,最先取用最上层的盘子。以下哪个类型使用了与其相同的原理? A Queue B BitArray C Stack D Hashtable,课后习题,5. 使用Visual Studio 2005 来创建一个应用程序,以供用户生成宏,其中每个宏将包含一系列命令。此应用程序应实现下面的功能:可以让用户删除宏中最后一个命令,一旦用户从宏中删除最后一个命令后,它又提供选项以让用户继续删除剩下命令的最后一项。如果允许用户以这种方式从宏中删除命令,直至宏中不再有任何命令为止,则以下那种集合最便于实现此删除逻辑? A 泛型 Queue B 泛型 Dictionary C 泛型 Stack D 泛型 List,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1