集合
什么是集合
在定义集合时,我们通常会将集合和数组进行比较。
数组
数组是一组相同数据类型数据的集合,可以通过下表对元素进行操作。但是数组也存在缺点,它采用固定长度且元素相对操作比较繁琐。
集合类(集合)
为了解决数组存在的这些问题,.NET中引入集合对象,其长度可以调整且元素操作简单方便。
在软件开发过程中,经常需要保存各种数据,因此计算机在处理问题时就需要解决一下3个问题:
(1)如何方便高效地组织和显示数据
(2)如何存储数据
(3)如何对存储的数据进行操作
前人在思索这些问题的过程中总结了一套解决方式,称之为数据结构。.NET平台封装好了一些常用的数据结构,称之为集合类,简称“集合”。
案例演示
下面以客户排队演示数组和与集合的使用。
首先我们创建一个控制台应用程序,然后添加一个Customer类,代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JiHe
{
public class Customer
{
//定义一个无参的构造方法
public Customer() { }
//定义一个有参数的构造方法
public Customer(string name, int age, string address)
{
Name = name;
Age = age;
Address = address;
}
public string Name { get; set; }
public int Age { get; set; }
public string Address { get; set; }
}
}
接着在Program中来调用构造方法:使用数组来存储对象
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JiHe
{
class Program
{
static void Main(string[] args)
{
//创建两个Customer对象并实例化
Customer customer_1 = new Customer("张三",18,"北京");
Customer customer_2 = new Customer("李四", 19, "上海");
Customer customer_3 = new Customer("王五", 20, "深圳");
//创建一个Customer类型的数组
Customer[] list = new Customer[2]; //数组长度为2
//数组下标是从0开始的
list[0] = customer_1;
list[1] = customer_2;
list[2] = customer_3;
Console.WriteLine("排队等待的客户有:");
for (int i = 0; i < list.Length; i++)
{
Console.WriteLine("{0}号:{1}",i+1,list[i].Name);
}
}
}
}
此时运行结果如图所示,
由于数组长度只有2,但是我们添加了3个对象到数组里面去,所以报错。
因此,当存储一系列对象时,我们就要使用功能更为强大的集合。
使用集合来存储对象:使用集合类,需要导入System.Collections命名空间
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace JiHe
{
class Program
{
static void Main(string[] args)
{
//创建两个Customer对象并实例化
Customer customer_1 = new Customer("张三",18,"北京");
Customer customer_2 = new Customer("李四", 19, "上海");
Customer customer_3 = new Customer("王五", 20, "深圳");
//创建一个集合对象
ArrayList list = new ArrayList();
list.Add(customer_1);
list.Add(customer_2);
list.Add(customer_3);
Console.WriteLine("排队等待的客户有:");
//集合类的Count属性用于获取存储对象的个数
for (int i = 0; i < list.Count; i++)
{
//获取集合中对象必须进行类型转换,将list转换为Customer类型
Console.WriteLine("{0}号:{1}",i+1,((Customer)list[i]).Name)
}
}
}
}
运行结果如图所示,成功运行:
通过这个案例,可以发现,集合相对于数组,最大的优势就是长度可以变化,按需分配。而数组呢,它的长度比较固定。所以当我们在程序中存储一些对象时,建议大家使用集合。
集合的主要特征与类型
C#中的集合表示可以通过遍历方式来访问一组对象,其主要特征如下:
(1)动态地改变大小
(2)可存储任意类型的对象
(3)提供一系列操作集合中对象的方法
C#中的集合提供了一套性能优良、使用方便的类和接口。C#中的集合被定义在System.Collections命名空间中,如ArrayList(数据列表)、Hashtable(字典)、Queue(队列)、Stack(栈)和SortedList(排序列表)等。
集合 | 说明 | |
---|---|---|
List | 可以像数组一样按索引访问列表,但提供了其他方法来搜索和排序 | |
Queue | 先入先出数据结构,提供了方法将数据项添加到队列的一段,从另一端删除项,以及只检查不删除 | |
Stack | 先入后出数据结构,提供了方法将数据压入栈顶,从栈顶出栈,以及只检查栈顶的项而不删除 | |
LinkedList | 双向有序列表,为任何一端的插入和删除进行了优化,这种集合既可作为队列,也可作为栈,还支持列表那样的随机访问 | |
HashSet | 无序值列表,为快速数据获取而优化,提供了面向集合的方法来判断它容纳的项是不是另一个HashSet 对象中的项的子集,以及计算不同HashSet 对象的交集和并集 | |
Dictionary | 字典集合允许根据键而不是索引来获取值 | |
SortedList | 键/值对的有序列表,键必须实现Icomparable 接口 |