版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、csharpnet1第四章第四章 数组和集合数组和集合c#.net程序设计c#.net程序设计csharpnet本章主要内容本章主要内容l集合类型接口集合类型接口ienumerable、icollection、ilist和和idictionaryl数组数组array、arraylist和和list泛型类泛型类lhashtable类和类和dictionary泛型类泛型类lsortedlist和和sortedlist泛型类泛型类l队列队列queue类和类和queue泛型类泛型类,堆栈堆栈stack类和类和stack 泛型类泛型类c#.net程序设计csharpnet集合类型概述集合类型概述l集合通
2、常可以分为常用集合集合通常可以分为常用集合, 专用集合等类型:专用集合等类型:l常用集合。常用集合有泛型和非泛型之分。非泛常用集合。常用集合有泛型和非泛型之分。非泛型集合是以型集合是以object 类型为元素集合,如哈希表类型为元素集合,如哈希表hashtable、队列、队列queue、堆栈、堆栈stack、和列表、和列表arraylist,。泛型集合类型是非泛型类型的直接。泛型集合类型是非泛型类型的直接模拟。泛型集合包含模拟。泛型集合包含arraylist的泛型版的泛型版list,hashtable的泛型版的泛型版dictionary集合等。集合等。 l专用集合。这些集合都具有专门的用途,通
3、常用专用集合。这些集合都具有专门的用途,通常用于处理特定的元素类型,如于处理特定的元素类型,如 stringdictionary是是将键和值强类型化为字符串而不是将键和值强类型化为字符串而不是object来实来实现现hashtable集合类型。集合类型。集合类型集合类型c#.net程序设计csharpnetienumerable接口接口l集合是基于集合是基于ienumerable接口、接口、icollection接口、接口、ilist接口、接口、idictionary接口,或其泛型集合中的相应接口,或其泛型集合中的相应接口,而接口,而ienumerable接口、接口、icollection接口
4、是大部接口是大部分集合类所共同实现的。下面分别介绍分集合类所共同实现的。下面分别介绍ienumerable接口、接口、icollection接口。接口。l第一种集合是实现第一种集合是实现ienumerable接口的集合类,接口的集合类,ienumerable接口只有一个公共方法:接口只有一个公共方法:ienumerator getenumerator() 该方法返回一个用于该方法返回一个用于foreach简单迭简单迭代循环访问集合的枚举数。所有实现了代循环访问集合的枚举数。所有实现了ienumerable接口的集合类如数组接口的集合类如数组array,arraylist集合类型等都集合类型等都
5、可以用于可以用于foreach循环语句。循环语句。ienumerator接口的成员接口的成员如下表。如下表。 集合类型集合类型属性current 获取集合中的当前元素。方法movenext 将枚举数推进到集合的下一个元素。 方法reset 将枚举数设置为其初始位置,该位置位于集合中第一个元素c#.net程序设计csharpneticollection 接口icollection 接口继承ienumerable接口,除了继承ienumerable接口成员外,还有下表所示的成员。 属性count 获取 icollection 中包含的元素数。属性issynchronized 获取一个值,该值指示是
6、否同步对icollection的访问(线程安全)。属性syncroot 获取可用于同步 icollection 访问的对象。方法copyto 从特定array 索引处开始,将icollection元素复制到一个array。 集合类型集合类型c#.net程序设计csharpnetlist 接口接口list 接口表示可按照索引单独访问的对象的非泛型集合接口。接口表示可按照索引单独访问的对象的非泛型集合接口。ilist 接口继承了接口继承了icollection接口和接口和ienumerable接口,接口,ilist是所有是所有非泛型列表的基接口。非泛型列表的基接口。ilist接口的公共属性与方法接
7、口的公共属性与方法 如下表如下表:数组数组array、arraylist和和list泛型类泛型类属性isfixedsize 获取一个值,指示 ilist 是否具有固定大小。属性isreadonly 获取一个值,该值指示 ilist 是否为只读。属性item 获取或设置指定索引处的元素。方法add 将某项添加到 ilist 中。 方法clear 从 ilist 中移除所有项。 方法contains 确定 ilist 是否包含特定值。 方法indexof 确定 ilist 中特定项的索引。 方法insert 将一个项插入指定索引处的 ilist。 方法remove 从 ilist 中移除特定对象的
8、第一个匹配项。 方法removeat 移除指定索引处的 ilist 项。 c#.net程序设计csharpnet数组数组array类类larray 类是所有数组的基类,提供创建、操作、搜索和类是所有数组的基类,提供创建、操作、搜索和排序数组的方法,排序数组的方法,array 类定义语法如下:类定义语法如下:public abstract class array : icloneable, ilist, icollection, ienumerable。因此。因此array类实现类实现ilist, icollection, ienumerable,icloneable接口,也就是说,接口,也就是
9、说,array类类实现了这些接口的方法成员。实现了这些接口的方法成员。larray类除了类除了copy,copyto外其它常用的方法:外其它常用的方法:larray.clear方法:方法:public static void clear (array array,int index,int length) larray.clone方法是实现方法是实现icloneable接口的方法,接口的方法,clone方法创建数组方法创建数组array的浅表副本,数组的浅表副的浅表副本,数组的浅表副本仅复制数组的元素(无论它们是引用类型还是值类本仅复制数组的元素(无论它们是引用类型还是值类型),但不复制这些引
10、用所引用的对象。新数组中的型),但不复制这些引用所引用的对象。新数组中的引用与原始数组中的引用指向相同的对象。数组使用引用与原始数组中的引用指向相同的对象。数组使用copy,copyto方法复制的也是浅表副本。所以这三个方法复制的也是浅表副本。所以这三个复制方法得到的复制的副本都是一样。复制方法得到的复制的副本都是一样。 数组数组array、arraylist和和list泛型类泛型类csharpnetpublic class studentpublic string name;public student(string name)this.name = name;public class cl
11、onecopyarraypublic 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 studentarrstu.length;array.co
12、py(arrstu,arrstucopy, arrstu.length);/拷贝数组console.writeline(原来数组内容);printindexandvalues(arrstu);console.writeline(克隆数组内容:);printindexandvalues(arrstuclone);console.writeline(改变克隆数组内容之前);例:演示数组array的copy和clone方法的使用, clonecopyarray项目代码:csharpnetconsole.writeline(arrstu2.name: 0, arrstu2.name);console.
13、writeline(arrstuclone2.name: 0, arrstuclone2.name);console.writeline(arrstucopy2.name: 0, arrstucopy2.name);arrstuclone2.name = student2clonenew;/arrstucopy2.name = student2copynew;console.writeline(改变克隆数组内容之后);console.writeline(arrstu2.name: 0, arrstu2.name);console.writeline(arrstuclone2.name: 0,
14、arrstuclone2.name);console.writeline(arrstucopy2.name: 0, arrstucopy2.name);public static void printindexandvalues(array myarray)for (int i = myarray.getlowerbound(0); i = myarray.getupperbound(0); i+)console.writeline(t0:t1, i, myarray.getvalue(i);arrstuclone是使用clone方法复制的student类对象数组,arrstucopy是使用c
15、opy方法复制的student类对象数组,由于它们都是复制的浅表副本,所以在三个数组的引用都指向相同的student类对象数组。c#.net程序设计csharpnetarraylist 类类larray用作所有数组的基类,而用作所有数组的基类,而arraylist是较为复杂的数组。是较为复杂的数组。arraylist 类和类和array 类一样都实现类一样都实现ilist, icollection, ienumerable, icloneable接口。接口。larraylist类除了所实现的类除了所实现的ilist, icollection, ienumerable, icloneable接口
16、的方法成员,还包含下面主要属性和方法:接口的方法成员,还包含下面主要属性和方法:属性capacity 获取或设置 arraylist 可包含的元素数。方法addrange 将 icollection 的元素添加到 arraylist 的末尾。 方法binarysearch 使用对分检索算法在已排序arraylist或它的部分中查找特定元素。 方法insertrange 将集合中的某个元素插入 arraylist 的指定索引处。 方法removerange 从 arraylist 中移除一定范围的元素。 方法setrange 将集合中的元素复制到 arraylist 中一定范围的元素上。 方法s
17、ort 对 arraylist 或它的一部分中的元素进行排序。 方法toarray 将 arraylist 的元素复制到新数组中。 csharpnet使用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);/添加一个元素 m
18、yal.addrange(new string quick, brown, fox, jumped, over, the, lazy, dog );/添加一组元素 printindexandvalues(myal); / 显示arraylist的值 string myarr = (string)myal.toarray(typeof(string); /将元素复制数组 printindexandvalues(myarr); / 显示数组内容 public static void printindexandvalues(arraylist mylist) int i = 0; foreach (
19、object o in mylist) console.write(t0:t1, i+, o); public static void printindexandvalues(string myarr) for (int i = 0; i myarr.length; i+) console.write(t0:t1, i, myarri); c#.net程序设计csharpnetlist 泛型类泛型类llist 泛型类是泛型类是 arraylist 类的泛型等效类,表示可通过索引访问的强类型类的泛型等效类,表示可通过索引访问的强类型列表。所谓的强类型,是指创建列表列表。所谓的强类型,是指创建列表
20、list时指定集合类型,而不是时指定集合类型,而不是arraylist的的object集合类型,这样对于值类型的集合类型,这样对于值类型的list泛型类来说,无需装泛型类来说,无需装箱和取消装箱或转换。箱和取消装箱或转换。listtsample项目的代码示例演示项目的代码示例演示 list 泛型类泛型类:using system;using system.collections.generic;public class example public static void main() /创建创建string的的list泛型实例泛型实例,创建列表时指定集合类型为创建列表时指定集合类型为stri
21、ng list dinosaurs = new list(); console.writeline(ncapacity: 0, dinosaurs.capacity);/显示显示list容量容量 dinosaurs.add(tyrannosaurus);/向向list添加添加 dinosaurs.add(amargasaurus); dinosaurs.add(mamenchisaurus); dinosaurs.add(deinonychus);csharpnetdinosaurs.add(compsognathus);foreach (string dinosaur in dinosaur
22、s) console.writeline(dinosaur);console.writeline(ncapacity: 0, dinosaurs.capacity);console.writeline(count: 0, dinosaurs.count);console.writeline(ncontains(deinonychus): 0, dinosaurs.contains(deinonychus);/判断列表是否包含判断列表是否包含deinonychusdinosaurs.insert(2, compsognathus);/在位置插入在位置插入compsognathus“foreach
23、 (string dinosaur in dinosaurs) console.writeline(dinosaur);console.writeline(ndinosaurs3: 0, dinosaurs3);/使用位置索引使用位置索引dinosaurs.remove(compsognathus);/删除删除compsognathusforeach (string dinosaur in dinosaurs)console.writeline(dinosaur);dinosaurs.trimexcess();/根据集合数量缩减容量根据集合数量缩减容量console.writeline(ntr
24、imexcess()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); c#.net程序设计csharpnetlist 泛型类泛型类代码分析:代码分析:l使用默认构造函数创建一个空的字符串类型的使用默认构造函数创建一个空的字符串类型的
25、list泛型列泛型列表。随后显示表。随后显示 capacity 属性,然后使用属性,然后使用 add 方法添加方法添加若干个项。添加的项被列出,若干个项。添加的项被列出,capacity 属性会同属性会同 count 属性一起再次显示,指示已根据需要增加了容量。属性一起再次显示,指示已根据需要增加了容量。 l使用使用 contains 方法测试该列表中是否存在某个项,使用方法测试该列表中是否存在某个项,使用 insert 方法在列表的中间插入一个新项,然后再次显示方法在列表的中间插入一个新项,然后再次显示列表的内容。列表的内容。 l默认的默认的 item 属性(属性(c# 中的索引器)用于检索
26、项,中的索引器)用于检索项,remove 方法用于移除前面添加的重复项的第一个实例,方法用于移除前面添加的重复项的第一个实例,然后,该示例再次显示内容。然后,该示例再次显示内容。remove 方法总是移除它方法总是移除它所遇到的第一个实例。所遇到的第一个实例。l使用使用 trimexcess 方法减小容量以匹配计数,然后显示方法减小容量以匹配计数,然后显示 capacity 和和 count 属性。如果未用容量已经小于总容量属性。如果未用容量已经小于总容量的的 10%,则列表容量不会进行调整。,则列表容量不会进行调整。l使用使用 clear 方法移除列表中的所有项,并显示方法移除列表中的所有项
27、,并显示 capacity 和和 count 属性。属性。数组数组array、arraylist和和list泛型类泛型类c#.net程序设计csharpnetlist,arraylist 类与类与array数组的区别数组的区别:array 的容量是固定的,而的容量是固定的,而 arraylist的容量可根据需要自动扩充。如的容量可根据需要自动扩充。如果更改了果更改了 capacity 属性的值,则可以自动进行内存重新分配和元属性的值,则可以自动进行内存重新分配和元素复制。素复制。larraylist提供添加、插入或移除某一范围元素的方法。在提供添加、插入或移除某一范围元素的方法。在 array
28、 中,只能一次获取或设置一个元素的值。中,只能一次获取或设置一个元素的值。l使用使用 synchronized 方法很容易创建方法很容易创建 arraylist 的同步版本。的同步版本。array 将实现同步的任务留给了用户。将实现同步的任务留给了用户。larraylist提供将只读和固定大小包装返回到集合的方法;而提供将只读和固定大小包装返回到集合的方法;而 array 不提供。不提供。l可以设置可以设置 array 的下限,但的下限,但 arraylist的下限始终为零。的下限始终为零。larray 可以具有多个维度,而可以具有多个维度,而 arraylist始终只是一维的。始终只是一维的
29、。l特定类型(不包括特定类型(不包括object)的数组)的数组array的性能优于的性能优于arraylist,这,这是因为是因为arraylist的元素属于的元素属于object类型,所以在存储或检索值类类型,所以在存储或检索值类型时通常发生装箱和取消装箱操作。不过,在不需要重新分配时型时通常发生装箱和取消装箱操作。不过,在不需要重新分配时(即最初的容量十分接近列表的最大容量),(即最初的容量十分接近列表的最大容量),list泛型类的性能与泛型类的性能与同类型的数组十分相近。同类型的数组十分相近。l需要数组的大多数情况都可以改为使用需要数组的大多数情况都可以改为使用arraylist或或l
30、ist泛型类;它泛型类;它们更容易使用,并且一般与相同类型的数组具有相近的性能。尽量们更容易使用,并且一般与相同类型的数组具有相近的性能。尽量使用使用list类,而不是使用类,而不是使用arraylist类或自己编写强类型包装集合。类或自己编写强类型包装集合。数组数组array、arraylist和和list泛型类泛型类c#.net程序设计csharpnethashtable 、dictionary和和sortedlist集合类集合类 hashtable 、dictionary和sortedlist集合类都实现idictionary, icollection, ienumerable, icl
31、oneable接口。其中idictionary接口表示键/值对的集合接口,或者说hashtable 、dictionary和sortedlist都是关于键/值对的集合。lidictionary接口是键/值对的非通用集合的基接口。每个元素都是一个存储在 dictionaryentry对象中的键/值对。 lidictionary接口继承了icollection, ienumerable接口,除了icollection,ienumerable接口成员外,还有以下成员:csharpnet属性isfixedsize 获取一个值,该值指示 idictionary 对象是否具有固定大小。属性isreadon
32、ly 获取一个值,该值指示 idictionary 对象是否为只读。属性item 获取或设置具有指定键的元素。属性keys 获取 icollection 对象,它包含 idictionary 对象的键。属性values 获取 icollection 对象,它包含 idictionary 对象中的值。方法add 在 idictionary 对象中添加一个带有所提供的键和值的元素。 方法clear 从 idictionary 对象中移除所有元素。 方法contains 确定 idictionary 对象是否包含具有指定键的元素。 方法getenumerator 返回一个用于idictionary对
33、象的idictionaryenumerator对象。 方法remove 从 idictionary 对象中移除带有指定键的元素。 idictionary接口成员csharpnetusing system.collections;/使用hashtable类的项目hashtablesample的代码 :public class sampleshashtable public static void main() hashtable ht = new hashtable();/创建hashtable实例ht ht.add(n01, 张三);/添加将带有指定键和值的元素添加到ht ht.add(n02
34、, 李四); 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)方法集合添加元素。
35、hashtable的元素是一个键/值对,元素类型既不是键的类型,也不是值的类型,而是dictionaryentry类型,因此foreach循环语句使用foreach(dictionaryentryde in ht)。dictionaryentry是结构类型,具有object类型的键属性key和object类型的值属性key。 csharpnet使用dictionary泛型类dictionarysample项目代码:public class sample public static void main() / 创建键和值都为string的dictionary对象实例openwith. dicti
36、onary 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 /插入具有重复键的元素因起异常 openwith.add(txt, winword.exe); catch (argumentexception) console.writeline(an e
37、lement with key = txt already exists.); / 使用键索引得到其值 console.writeline(for key = rtf, value = 0.,openwithrtf); openwithrtf = winword.exe;/使用键索引设置其值 console.writeline(for key = rtf, value = 0.,openwithrtf); openwithdoc = winword.exe;/如果该键不存在,添加新key/value元素csharpnet try /如果没有该键,取其值引起异常 console.writelin
38、e(for key = tif, value = 0.,openwithtif); 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
39、.containskey(ht)/判断是否含有该键 openwith.add(ht, hypertrm.exe); console.writeline(value added for key = ht: 0,openwithht); foreach (keyvaluepair kvp in openwith)/遍历该字典console.writeline(key = 0, value = 1,kvp.key, kvp.value); /取该字典值属性,值集合valuecollection是强类型集合(本例string类型) dictionary.valuecollection valuecol
40、l =openwith.values; foreach (string s in valuecoll)/遍历该字典值集合valuecollectionconsole.writeline(value = 0, s); csharpnet/取该字典的键属性,键集合keycollection是强类型集合(本例string类型) dictionary.keycollection keycoll = openwith.keys; foreach (string s in keycoll)/遍历该字典键集合valuecollection console.writeline(key = 0, s); con
41、sole.writeline(n删除键为(doc)的这对元素); openwith.remove(doc); if (!openwith.containskey(doc) console.writeline(key doc is not found.); 代码分析:使用item属性(即索引器)来检索值,当请求的键不存在时将引发keynotfoundexception,与键相关联的值可被替换。当程序必须经常尝试字典中不存在的键值时,使用trygetvalue方法作为一种更有效的方法来检索值,使用containskey方法在调用add方法之前测试某个键是否存在。使用keys属性和values属性来
42、单独枚举键和值。使用remove方法删除集合中的一个元素。c#.net程序设计csharpnetqueue类和类和queue泛型类泛型类 lqueue类和类和queue泛型类都是先进先出集合类,它们泛型类都是先进先出集合类,它们实现实现ienumerable、icollection和和icloneable等接口,等接口,queue泛型类还实现了泛型类还实现了ienumerable和和icollection泛泛型接口。型接口。l队列在按接收顺序存储消息方面可以方便地进行顺序队列在按接收顺序存储消息方面可以方便地进行顺序处理。此类将队列作为循环数组实现。存储在处理。此类将队列作为循环数组实现。存储
43、在queue中的对象在一端插入,从另一端移除。中的对象在一端插入,从另一端移除。queue接受空接受空引用作为有效值并且允许重复的元素。引用作为有效值并且允许重复的元素。l可以对可以对queue及其元素执行三种主要操作:及其元素执行三种主要操作:lenqueue将一个元素添加到将一个元素添加到queue的末尾。的末尾。ldequeue从从queue的开始处移除最旧的元素。的开始处移除最旧的元素。lpeek从从queue的开始处返回最旧的元素,但不将其从的开始处返回最旧的元素,但不将其从queue中移除。中移除。下面是使用队列下面是使用队列queue泛型类的泛型类的queuesample项目的代
44、码:项目的代码:csharpnetusing 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); conso
45、le.writeline(ndequeuing 0, numbers.dequeue(); console.writeline(peek at next item: 0, numbers.peek(); console.writeline(dequeuing 0, numbers.dequeue(); / 使用 toarray 方法将队列元素复制到数组,然后将该数组 /传递给接受 ienumerable 的 queue 构造函数以创建队列副本 queue queuecopy = new queue(numbers.toarray(); foreach (string number in que
46、uecopy) console.writeline(number); csharpnet /创建一个大小是队列大小两倍的数组 string array2 = new stringnumbers.count * 2; /使用 copyto 方法从数组中间开始复制数组元素 numbers.copyto(array2, numbers.count); /使用接受ienumerable 的queue 构造函数创建第二个队列 queue queuecopy2 = new queue(array2); foreach (string number in queuecopy2) console.writeline(number); console.writeline(nqueuecopy.contains(four) = 0, queuecopy.co
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东省江门市重点中学2025届高考数学三模试卷含解析
- 河南省商丘名校2025届高三3月份模拟考试英语试题含解析
- 山东省沂水县2025届高三适应性调研考试英语试题含解析
- 深圳高级中学2025届高三第三次模拟考试英语试卷含解析
- 现代学徒制课题:现场工程师专项培养计划政策保障研究(附:研究思路模板、可修改技术路线图)
- 四川省峨眉第二中学2025届高三第四次模拟考试英语试卷含解析
- 新疆石河子高级中学2025届高考数学倒计时模拟卷含解析
- 陕西省西安高中2025届高三冲刺模拟数学试卷含解析
- 广东省佛山市普通高中2025届高三压轴卷英语试卷含解析
- 2025届云南省曲靖市西南名校高三第六次模拟考试数学试卷含解析
- 包装装潢承印五项制度登记表
- 可比楼盘量化定价法
- xxxxx年猪文化节
- 钢结构项目技术服务和售后服务内容及措施
- 第二语言习得理论概述
- 水景施工工艺(包括防水)
- DAC数模转换实验报告
- 散货船持证清单
- 公路巡查记录表格模板
- 师德师风整改台账23668
- 河海大学水资源规划及利用复习知识点.
评论
0/150
提交评论