C# 集合和数组.docx
- 文档编号:8673241
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:21
- 大小:27.71KB
C# 集合和数组.docx
《C# 集合和数组.docx》由会员分享,可在线阅读,更多相关《C# 集合和数组.docx(21页珍藏版)》请在冰豆网上搜索。
C#集合和数组
数组和集合总结
在.NETFramework中提供了很多集合类,如ArrayList、BitArray、Hashtable、Queue、SortedList、Stack、ListDictionary、NameValueCollection、OrderedDictionary、StringCollection、List
在所有的集合中数组是性能最高的,如果要存储的数据类型一致和容量固定,特别是对值类型的数组进行操作时没有装箱和拆箱操作,效率极高。
在选择集合类型时应考虑几点:
(1)集合中的元素类型是否是一致的,比如集合中将要存储的元素都是int或者都是string类型的就可以考虑使用数组或者泛型集合,这样在存储数值类型元素就可以避免装箱拆箱操作,即使是引用类型的元素也可以避免类型转换操作。
(2)集合中的元素个数是否是固定的,如果集合中存储的元素是固定的并且元素类型是一致的就可以使用数组来存储。
(3)将来对集合的操作集中在那些方面,如果对集合的操作以查找居多可以考虑HashTable或者Dictionary
另外,在使用可变集合时如果不制定初始容量大小,系统会使用一个默认值来指定可变集合的初始容量大小,如果将来元素个数超过初始容量大小就会先在内部重新构建一个集合,再将原来集合中的元素复制到新集合中,可以在实例化可变集合时指定一个相对较大的初始容量,这样在向可变集合中添加大量元素时就可以避免集合扩充容量带来的性能损失。
System.Collections命名空间包含接口和类,这些接口和类定义各种对象(如列表、队列、位数组、哈希表和字典)的集合。
System.Collections.Generic命名空间包含定义泛型集合的接口和类,泛型集合允许用户创建强类型集合,它能提供比非泛型强类型集合更好的类型安全性和性能。
System.Collections.Specialized命名空间包含专用的和强类型的集合,例如,链接的列表词典、位向量以及只包含字符串的集合。
一.数组
数组是大部分编程语言中都支持的一种数据类型,无论C语言、C++还是C#以及Java都支持数组的概念。
数组是具有同一类型的多个对象的集合,是一种数据结构,包含同一类型的多个元素。
数组是一组具有相同类型的变量的集合,如一组整数、一组字符等。
组成数组的这些变量称为数组的元素。
每个数组元素都有一个编号,这个编号叫做下标,C#中的下标是从0开始的,最大的下标等于数组元素个数减一。
C#中可以通过下标来区别这些元素。
数组元素的个数有时也称之为数组的长度。
数组类型从类型System.Array继承而来。
System.Array类表示所有的数组,不论这些数组的元素类型或秩如何。
对数组定义的操作有:
根据大小和下限信息分配数组;编制数组索引以读取或写入值;计算数组元素的地址;以及查询秩、边界和数组中存储的值的总数。
1)数组是固定大小的,不能伸缩。
虽然System.Array.Resize这个泛型方法可以重置数组大小,但是该方法是重新创建新设置大小的数组,用的是旧数组的元素初始化。
随后以前的数组就废弃!
而集合却是可变长的。
2)数组要声明元素的类型,集合类的元素类型却是object.
3)数组可读可写,不能声明只读数组。
集合类可以提供ReadOnly方法以只读方式使用集合。
4)数组要有整数下标才能访问特定的元素,然而很多时候这样的下标并不是很有用。
集合也是数据列表却不使用下标访问。
很多时候集合有定制的下标类型,对于队列和栈根本就不支持下标访问!
1.定义
一个数组的定义中包含以下几个要素:
Ø元素类型(相同)
Ø数组的维数(初始化时必须给定)
Ø每个维数的上下限
首先,给定类型的数组只能保存该类型的元素。
其次要规定数组的维数,可以用几何的知识理解数组的维数,可以用一维坐标轴来理解一维数组;用平面直角坐标系来理解二维数组;用三维立体坐标系来理解三维数组等。
再次,数组必须规定每个维数的大小。
如:
int[]anIntArray;//定义数组
anIntArray={1,2,3};//上述代码定义了一个数组并对其进行了初始化。
可以一次完成
int[]sz=newint[];//初始化数组,如果不指定大小,报语法错误。
anIntArray=newint[]{1,2,3};//用new关键字初始化数组的元素
anIntArray=newint[3]{1,2,3};//指定数组大小用new关键字初始化数组元素
数组还有另外一种初始化方式,即指定数组大小并用new关键字初始化数组的元素:
int[]anIntArray=newint[3];
执行时.NET将会为数组中的每一个元素赋予同一个(定义类型的)默认值。
对于Int型的变量来说这个默认值是0。
2.数组的索引
数组的索引也就是通常所说的数组下标,英文为Index。
数组的索引是从0开始的。
3.数组的遍历
C#提供了foreach语句以实现数组的遍历功能。
可以使用foreach语句访问数组中的每个元素而不需要确切地知道每个元素的索引。
int[]myArray=newint[5]{14,25,7,36,53};
//采用foreach语句对myArray进行遍历
foreach(intnumberinmyArray)
{
Console.Write(number);
}
//
for(inti=0;i<5;i++)
{
Console.Write(myArray[i]);
}
二.ArrayList
动态数组ArrayList.ArrayList类提供了继承了IList接口。
ILsit接口成员:
add、insert、RemoveAt、Remove、contains、Clear、indexof方法,它最大的特色在于提供类似数组索引的访问机制。
◆数组的容量是固定的,而ArrayList的容量可根据需要自动扩充,定义是如果未设置容量,向ArrayList添加结束后,容量为初始化的2倍,定义时设置容量,超出时,该容量自动翻倍。
如果更改了Capacity属性的值,则可以自动进行内存重新分配和元素复制。
◆ArralyList提供添加、插入或移除某一范围元素的方法。
在数组中,只能一次获取或设置一个元素的值。
◆使用Synchronized方法很容易创建ArrayList的同步版本。
数组将实现同步的任务留给了用户。
◆ArrayList提供将只读和固定大小包装返回到集合的方法;而数组则不提供该方法。
◆ArrayList只提供一维的形式,而数组可以是多维的。
1.ArrayLlst的常用属性:
属性说明
Capacity获取或设置ArrayList可包含的元素数
Count获取ArrayList中实际包含的元素数
IsFixedSize获取一个值,该值指示ArrayList是否具有固定大小
IsReadOnly获取一个值,该值指示ArrayList是否为只读
IsS_ynchrOnlzed获取一个值,该值指示是否同步对ArrayList的访问
Item获取或设置指定索引处的元素
SyncRoot获取可用于同步ArrayList访问的对象
2.ArrayList元素的添加
C#中为ArrayList提供了两个添加元素的方法,分别为ArrayList.Add();和ArrayList.Insert();
1)ArrayList.Add():
该方法将给定的Value对象插入到ArrayList的现有数据的末尾处。
例:
ArrayListarrayList=newArrayList(3);
arrayList.Add("WWW");
arrayList.Add("002");
Response.Write(arrayList.Capacity.ToString());//输出arrayList的容量
//输出arrayList中元素的个数
Response.Write(arrayList.Count.ToString());
//输出arrayList索引为0的值:
"WWW"
Response.Write(arrayList[0].ToString());
//输出arrayList索引为1的值:
"002"
Response.Write(arrayList[1].ToString());
当ArrayList为固定大小或只读时,如果对其进行元素的插入操作或超出固定大小时,则将会引发NotSupportExCeption异常。
解决办法是先检测ArrayList是否为只读或固定大小,之后再进行插入,可以使用ArrayList.IsFixedSize和ArrayList.IsReadOnly进行判断。
2)ArrayList.Insert():
该方法向指定的索引位置插入value,如果其后有元素将自动向后错开。
由于index参数的存在,因此,Insert方法比Add多了一个可能产生的异常。
该异常为ArgumentoutofRangeExceptlon,当index小于零或大于ArrayList中的元素个数时引发。
例:
ArrayListarrayList=newArrayList(3);
//初始添加插入到ArrayList的现有数据的末尾处:
索引为0
arrayList.Add("WWW");
//初始添加插入到ArrayList的现有数据的末尾处:
索引为1
arrayList.Add("002");
arrayList.Insert(1,"Wu");//添加位置为索引为1
arrayList.Insert(2,"zy");//添加位置为索引为2
//输出arrayList的容量:
6
Response.Write(arrayList.Capacity.ToString());
//输出arrayList中元素的个数:
4
Response.Write(arrayList.Count.ToString());
//输出arrayList索引为0的值:
"WWW"
Response.Write(arrayList[0].ToString());
//输出arrayList索引为1的值:
"Wu"
Response.Write(arrayList[1].ToString());
//输出arrayList索引为2的值:
"zy"
Response.Write(arrayList[2].ToString());
//输出arrayList索引为3的值:
"002"
Response.Write(arrayList[3].ToString());
在指定的位置成功地插入了指定的字符串。
同时,由于ArrayList的初始容量为3,而所有插入的元素个数为4,当插入第4个元素的时候ArrayList的容量翻倍,因此,运行结果中显示容量大小为6。
3)集体添加
//集体添加方法一
ArrayListarrayList=newArrayList(3);
foreach(intnumberinnewint[6]{9,3,7,2,4,8})
{
arrayList.Add(number);
}
//集体添加方法二
int[]number2=newint[2]{11,12};
arrayList.AddRange(number2);
//新ArrayList只取旧ArrayList一部份
ArrayListal2=newArrayList(arrayList.GetRange(0,2));
3.ArrayList元素的删除
C#中为删除ArrayList元素提供了以下几种方法
◆ArrayList.Clear():
为一个不带参数的方法,功能为从ArrayList中移除所有元素
ArrayListarrayList=newArrayList(3);
arrayList.Add("WWW");//初始添加插入到ArrayList的现有数据的末尾处:
索引为0
arrayList.Add("002");//初始添加插入到ArrayList的现有数据的末尾处:
索引为1
Response.Write(arrayList.Capacity.ToString());//输出arrayList的容量:
3
Response.Write(arrayList.Count.ToString());//输出arrayList中元素的个数:
2
arrayList.Clear();//清空arrayList
//输出arrayList的容量:
3
Response.Write(arrayList.Capacity.ToString());
//输出arrayList中元素的个数:
0
Response.Write(arrayList.Count.ToString());
◆ArrayList.Remove():
从指定的ArrayList中移除obj对象,如obj不存在则不引发异常,ArrayList保持不变。
ArrayListarrayList=newArrayList(3);
arrayList.Add("WWW");//初始添加插入到ArrayList的现有数据的末尾处:
索引为0
arrayList.Add("002");//初始添加插入到ArrayList的现有数据的末尾处:
索引为1
Response.Write(arrayList.Capacity.ToString());//输出arrayList的容量:
3
Response.Write(arrayList.Count.ToString());//输出arrayList中元素的个数:
2
arrayList.Remove("WWW");//移除object(WWW,有,移除该对象)
arrayList.Remove("003");//移除object(003,没有,不报异常,ArrayList保持不变)
Response.Write(arrayList.Capacity.ToString());//输出arrayList的容量:
3
Response.Write(arrayList.Count.ToString());//输出arrayList中元素的个数:
1
◆ArrayList.RemoveAt():
提供了根据索引值移除ArrayList元素的方法。
ArrayListarrayList=newArrayList(3);
arrayList.Add("WWW");//初始添加插入到ArrayList的现有数据的末尾处:
索引为0
arrayList.Add("002");//初始添加插入到ArrayList的现有数据的末尾处:
索引为1
Response.Write(arrayList.Capacity.ToString());//输出arrayList的容量:
3
Response.Write(arrayList.Count.ToString());//输出arrayList中元素的个数:
2
arrayList.RemoveAt(0);//根据索引移除(【0】,有,移除该对象,其后有数据往前补)
arrayList.RemoveAt
(1);//根据索引移除(【1】,没有,报异常:
索引超出范围。
必须为非负值并小于集合大小)
Response.Write(arrayList.Capacity.ToString());//输出arrayList的容量:
3
Response.Write(arrayList.Count.ToString());//输出arrayList中元素的个数:
1
4.ArrayList元素的获取
1)通过arrayList[index]取出,取出时为object类型。
ArrayListarrayList=newArrayList();
arrayList.Add("WWW");//初始添加插入到ArrayList的现有数据的末尾处:
索引为0
arrayList.Add("002");//初始添加插入到ArrayList的现有数据的末尾处:
索引为1
Response.Write(arrayList[0].ToString());//输出arrayList索引的【0】的值(存在,输出)
Response.Write(arrayList[2].ToString());//输出arrayList索引的【2】的值(不存在,报异常:
索引超出范围)
2)使用与数组相同的方法ArrayList进行遍历,即foreach语句
ArrayListarrayList=newArrayList();
arrayList.Add("WWW");
arrayList.Add("002");
//遍历方法一:
遍历输出(不需要强转)
foreach(stringainarrayList)
{
Response.Write(a);
}
//遍历方法二
for(inti=0;i { //一定要强制转换(根据添加的类型) intnumber=(int)arrayList[i];Console.WriteLine(number); } 5.常用方法 1)Reverse()反转数组的元素 2)Sort()以从小到大的顺序排列数组的元素 3)Clone()复制一个数组 三.HashTable 在.NETFramework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。 它表示键(key)/值(value)对的集合,这些键/值对根据键的哈希代码进行组织。 它的每个元素都是一个存储在字典实体对象中的键/值对。 键不能为空引用,但值可以。 Hashtable中key/value键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对。 也就是说HashTable像一个字典,根据键可以查找到相应的值。 HashTable中的key/value均为object类型,由包含集合元素的存储桶组成。 存储桶是HashTable中各元素的虚拟子组,与大多数集合中进行的搜索和检索相比,存储桶可令搜索和检索更为便捷。 每一存储桶都与一个哈希代码关联,该哈希代码是使用哈希函数生成的并基于该元素的键。 HashTable是C#中一个较为复杂的类型,其构造函数就有16种之多,只介绍两种简单、实用的供参考: ◆HashTable() 构造函数定义使用默认的初始容量等默认值初始化HashTable类的新的空实例。 同ArrayList一样,其容量可以根据实际的需要自动增加。 HashTablemyHashTablel=newHashTable(); ◆HashTab]e(Int32) 构造函数使用指定的容量初始化HashTable类的新实例。 此处指定的容量是指对象最初可包含的元素的近似数目,其容量以后可以自动增加。 HashTablemyHashTable2=newHashTable(5); 1.HashTable元素的添加 C#为HashTable元素的添加提供了HashTable.Add(key,value);方法。 该方法的定义如下其中,key为要添加的元素的键,value为要添加元素的值,可以为空。 HashTable对于插入的键/值对没有具体的要求,可以是任意对象。 HashtablehashTable=newHashtable(); hashTable.Add(1,"WWW");//插入到Hashtable: key为1,int型 hashTable.Add(5,"PPP");//插入到Hashtable: key为5,int型 hashTable.Add("my","Wu");//插入到Hashtable: key为“my”,string型 Response.Write(hashTable.Count.ToString());//获取Hashtable的键值对个数 2.HashTable元素的获取 与数组和ArrayList不同,HashTable不可以通过HashTable[index]的方式获取元素。 HashTable是以一种键/值对的形式存在的,因此要通过键来访问HashTable中的值,即[key]. 例: strings=(string)hashTable["my"]; [key]存在则输出值。 不存在,报异常: 未将对象引入实例 1)C#中为HashTable的查找判断提供了以下方法: HashTable.Contains和HashTable.ContainsKey方法实现的功能相同,皆为判断HashTable中是否包含指定的键。 HashTable.ContainsValue为判断HashTable中是否包含指定的值。 ◆HashTable.Contains ◆HashTable.ContainsKey ◆HashTable.ContalnsValue HashtablehashTable=newHashtable(); hashTable.Add(1,"WWW"); hashTable.Add(5,"PPP"); hashTable.Add("my","Wu"); Response.Write(hashTable.Contains (1));//判断hashTable中是否存在key值为【1】(存在,返回true) Response.Write(hashTable.ContainsKey("my"));//判断hashTable中是否存在key值为【"my"】(存在,返回true) Response.Write(hashTable.ContainsValue("ppp"));//判断hashTable中是否存在Value值为【"ppp"】(不存在,返回false) 2)HashTable的遍历 C#中提供了foreach语句以对HashTable进行遍历。 由于HashTable的元素是一个键/值对,因此需要使用DictionaryEntry类型来进行遍历。 HashtablehashTable=newHashtable(); hashTable.Add(1,"WWW");//插入到Hashtable: key为1,int型 hashTable.Add(5,"PPP");//插入到Hashtable: key为5,int型 hashTable.Add("my","Wu");//插入
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C# 集合和数组 集合 数组