首页 > 代码库 > 集合及特殊集合
集合及特殊集合
集合的基本信息:
System.Collections命名空间包含接口和类,这些接口和类定义各种对象(如列表、队列、位组数、哈希表和字典)的集合。
System.Collections.Generic命名空间包含定义泛型集合的集合和类,泛型集合允许用户创建强类型集合,它能提供比非泛型强类型集合更好的类型安全性和性能。
System.Collections.Specialized命名空间包含专用的和强类型的集合,例如,链接的列表词典、位向量以及只包含字符串的集合。
常用的集合为ArrayList类;特殊集合一般会用到Queue队列集合、Stack栈集合还有Hashtable哈希表集合。
集合不同于数组,是一组可变数量的元素的组合,这些元素可能共享某些特征,需要以某种操作方式一起进行操作。一般来说,这些元素的类型是相同的。
集合与数组的区别:数组是连续的、同一类型数据的一块区域,而集合可以是不连续的、多种数据类型的。
一、ArrayList集合:
ArrayList实现了IList、ICollection、Ienumerable接口。
ArrayList与Array的名字很相似,现在来比较一下两者的异同:
相同点:
1、两者都实现了IList、ICollection、Ienumerable接口。
2、两者都可以使用整数索引访问集合中的元素,包括读取和赋值,且集合中的索引都从0开始。
不同点:
1、ArrayList是集合,而Array是数组;
2、ArrayList是具体类,Array是抽象类;
3、数组必须在实例化时指定元素的数量,该数量一旦确定就不可以更改了,而ArrayList实例时可以不指定集合元素数(有默认初始数量),当然你也可以指定初始容量;
4、获取数组的元素数时使用Length属性,而获取ArrayList集合的元素数时使用Count属性;
5、数组可以有多维,而ArrayList只能是一维。
ArrayList具体提供的功能:
属性——功能说明:
.Count——获取 ArrayList 中实际包含的元素数;
方法——功能说明:
.Add()——将对象添加到 ArrayList 的结尾处(先用Add占位,再进行赋值,赋值方式仅用于修改);
.Clear()——从 ArrayList 中移除所有元素;
.Clone()——创建 ArrayList 的浅表副本,克隆时需要转换数据类型(ArrayList al1=(ArrayList)al.Clone;);
.Contains()——确定某个元素是否在 ArrayList 中(bool a = al.Contains("5"););
.IndexOf()——已重载。返回 ArrayList 或它的一部分中某个值的第一匹配项的从零开始的索引;
.Insert()——将元素插入 ArrayList 的指定索引处,可以在任意位置插入。
.Remove()——从 ArrayList 中移除特定对象的第一个匹配项;
.RemoveAt——移除 ArrayList 的指定索引处的元素;
.Sort()——已重载。对 ArrayList 或它的一部分中的元素进行排序,升序排序;
.Reverse()——翻转整个集合,由升序排序变为降序排序。
foreach(object aa in al)——al集合中有不同类型元素时,用 Object 定义一个变量来遍历集合,Object 是所有数据类型的基类,接收任何类型;
Object aa=al;——Object 类型的aa接收al(ArrayList类型)相当于把al压缩到aa里。
练习:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace _1016集合及特殊集合练习 { class Program { static void Main(string[] args) { //定义一个集合,添加元素、插入元素、移除元素、遍历集合 ArrayList al = new ArrayList();//定义一个新的集合。集合是一个类,在System.Collections.库中,需要引用。 al.Add("祝");//向集合中加入元素,括号中为元素。 al.Add("愿");//索引号无需指定,从0号索引开始添加,添加到新的位置。 al.Add("祖"); al.Add("国"); al.Add("繁"); al.Add("荣"); al.Add("昌"); al.Add("盛"); al.Add("!"); foreach (string a in al)//遍历集合中的每一个元素,元素为string类型 { Console.Write(a); } Console.WriteLine(); al.Insert(1,"福");//在索引号为“1”的位置插入一个元素“福”字,其他元素依次往后排 al.Remove("愿");//移除al集合中的第一个“愿” al.RemoveAt(8);//移除al集合中索引号为8的元素 foreach (string b in al) { Console.Write(b); } Console.WriteLine(); Console.ReadLine(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace _1016集合及特殊集合练习 { class Program { static void Main(string[] args) { //集合中,由字符查询索引号、由索引号查询字符、获取集合的元素个数 ArrayList al = new ArrayList(); al.Add("祝"); al.Add("福"); al.Add("祖"); al.Add("国"); al.Add("繁"); al.Add("荣"); al.Add("昌"); al.Add("盛"); al.Add("!"); foreach(string s in al) { Console.Write(s); } Console.WriteLine(); int a = al.IndexOf("国");//由字符查询其索引号 Console.WriteLine(a); string b=al[6].ToString();//由索引号查询其字符 Console.WriteLine(b); int c = al.Count;//获取集合中元素个数 Console.WriteLine(c); Console.ReadLine(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace _1016集合及特殊集合练习 { class Program { static void Main(string[] args) { //输入人数,录入分数,存到集合里,之后按照由高到低的顺序读取出来,并求平均分 Console.Write("请输入人数:"); int r = int.Parse(Console.ReadLine()); ArrayList al = new ArrayList(); for (int i = 0; i < r; i++) { Console.Write("请输入第{0}个人的分数:", i + 1); int f = int.Parse(Console.ReadLine()); al.Add(f); } al.Sort(); al.Reverse(); Console.WriteLine("分数由高到低为:"); foreach (int j in al) { Console.Write(j + "\t"); } Console.WriteLine(); double sum = 0; for (int k = 0; k < r; k++) { sum += double.Parse(al[k].ToString()); } double avg = sum / r; Console.WriteLine("平均分为:" + avg); Console.ReadLine(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace _1016集合及特殊集合练习 { class Program { static void Main(string[] args) { //创建新的集合,并将之前的集合中的数据复制到新的集合,并判断集合中是否有某一数据 ArrayList al = new ArrayList(); al.Add("祝"); al.Add("福"); al.Add("祖"); al.Add("国"); al.Add("繁"); al.Add("荣"); al.Add("昌"); al.Add("盛"); al.Add("!"); ArrayList xal = new ArrayList(); xal = (ArrayList)al.Clone(); bool a = xal.Contains("荣"); Console.WriteLine(a); Console.ReadLine(); } } }
二、Stack 栈集合
栈集合:Stack(英文翻译为干草堆),元素先进后出,一个一个赋值,一个一个取值,按顺序。
属性和方法:
.Count——获取集合中元素的个数;
.Push()——将元素一个一个推入集合中,一次只能推一个;
.Peek()——查看集合中的元素,不弹出元素,元素个数不变;
.Pop()——查看并弹出集合中的元素,元素个数减少;
.Clear()——清空集合。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace _1016集合及特殊集合练习 { class Program { static void Main(string[] args) { //栈集合加入元素、移除元素、查看元素、获取元素个数 Stack st = new Stack(); st.Push("祝");//添加元素时用“push”,将元素推进stack集合中 st.Push("福"); st.Push("祖"); st.Push("国"); st.Push("繁"); st.Push("荣"); st.Push("昌"); st.Push("盛"); st.Push("!"); foreach (string a in st) { Console.Write(a);//栈集合元素先进后出,所以打遍历集合时,顺序为倒序 } Console.WriteLine(); int h = st.Count; Console.WriteLine("此时集合中元素的个数为:"+h); string y = st.Pop().ToString(); string c = st.Peek().ToString(); Console.WriteLine("移除的元素为:" + y); Console.WriteLine("第一个元素为:" + c); int g = st.Count; Console.WriteLine("此时集合中元素的个数为:" + g); Console.ReadLine(); } } }
三、Queue 队列集合
元素先进先出,一个一个的赋值一个一个的取值,按照顺序。此集合没有索引,先进的先出。
属性和方法:
.Count——获取集合中元素的个数;
.Enqueue()——将元素加入队列集合;
.DEqueue()——将元素从队列集合中移除,从头开始删除,不需要参数;
.Clear()——清空列表。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace _1016集合及特殊集合练习 { class Program { static void Main(string[] args) { //队列集合加入元素、移除元素、查看元素、获取元素个数 Queue st = new Queue(); st.Enqueue("祝");//添加元素时用“Enqueue”,将元素加入queue集合中 st.Enqueue("福"); st.Enqueue("祖"); st.Enqueue("国"); st.Enqueue("繁"); st.Enqueue("荣"); st.Enqueue("昌"); st.Enqueue("盛"); st.Enqueue("!"); foreach (string a in st) { Console.Write(a);//栈集合元素先进先出,所以打遍历集合时,顺序为正序 } Console.WriteLine(); int h = st.Count; Console.WriteLine("此时集合中元素的个数为:" + h); string y = st.Dequeue().ToString(); string c = st.Peek().ToString(); Console.WriteLine("移除的元素为:" + y); Console.WriteLine("第一个元素为:" + c); int g = st.Count; Console.WriteLine("此时集合中元素的个数为:" + g); Console.ReadLine(); } } }
四、Hashtable 哈希表集合
元素先进后出,一个一个的赋值,但只能一起取值。
属性和方法:
.Add(,)——添加key(主键)和元素;
.Remove()——移除括号内的元素;
.Contains()——判断集合中是否有括号内的元素;
.Count()——计算集合中元素的个数。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace _1016集合及特殊集合练习 { class Program { static void Main(string[] args) { //Hashtable 哈希表集合加入元素、移除元素、判断是否包含指定元素、获取元素个数 Hashtable ht = new Hashtable(); ht.Add(0,"祝");//哈希表集合插入时add(0,"祝")中,0为索引号,祝为添加的元素 ht.Add(1,"福"); ht.Add(2,"祖"); ht.Add(3,"国"); ht.Add(4,"繁"); ht.Add(5,"荣"); ht.Add(6,"昌"); ht.Add(7,"盛"); ht.Add(8,"!"); foreach(int i in ht.Keys)//Keys为key的集合 { Console.Write(i+" "); } Console.WriteLine(); foreach(string j in ht.Values)//Values为元素的集合 { Console.Write(j); } Console.WriteLine(); Console.WriteLine("集合中元素个数为:"+ht.Count); ht.Remove(3);//ht.Remove("繁");——错误,只能移除索引号,无法移除元素 ht.Remove(4); foreach (int k in ht.Keys)//Keys为key的集合 { Console.Write(k + " "); } Console.WriteLine(); foreach (string l in ht.Values)//Values为元素的集合 { Console.Write(l); } Console.WriteLine(); Console.WriteLine("集合中元素个数为:" + ht.Count); bool sf = ht.Contains("繁"); Console.WriteLine(sf); //若执行清空语句,则前面的输入内容都不再显示 //Console.Clear();//清空集合元素语句 //Console.WriteLine("清空集合后,元素个数为:"+ht.Count); Console.ReadLine(); } } }
集合及特殊集合