集合和泛型
集合的定义
u 集合(collection容器)
u 集合的定义:
n 数学上:把一些能够确定的不同的对象看成一个整体,就说这个整体是由这些对象的全体构成的集合,集合中每个对象叫做这个集合的元素
n C#中,集合是可以包含一组类型对象的数据类型,同时提供了为c#程序管理数据的各种方法,能灵活的管理对象
1) 集合是一组通用的数据类型,帮助我们集中地存储和管理数据
2) 集合使用的数据规则:一定要放相同类型的数据
3) 可以看做容器,放很多的数据
集合的优点
便于灵活的对一组相同类型的对象进行存储、检索等管理操作
集合容易使用,它们包括访问集合元素的索引器和遍历集合元素的IEnumerable接口
何时用:如果要对紧密相关的、类似的、较多或大量的数据对象进行有效的处理时,可以用集合
如:搜索。排序、反转、找最大或最小值
- 找出全班学生中年龄最大的、最小的
- 从全班学生名册中找有没有张三的学生
- 把this is good day 反转一下
集合的功能
存储功能【放>会放】
检索功能【取>会取】
其它管理功能:不同的集合类有所不同
集合的学习目标
能熟练的放值
能熟练的取值
能熟练的使用某些集合类型的特定的功能,如:
搜索,排序,反转,找最大或最小值等。
C#包含的结构
C#的集合【广义理论上】【c#的数据结构】
C#的集合包含 | 确切叫法 | 习惯叫法 | 区别 |
System.Array及派生类 | 数组 | 固定数组 不可变数字 数组 | 不可变数字 没有添加,插入、移除的功能 |
System.Collection命名空间中的数据类型 | 非泛型集合 | 集合 |
|
System.Collection.Generic命名空间中数据类型 | 泛型集合 | 泛型集合 | 泛型集合包含的类与非泛型包含的类基本一一对应,是来取代非泛型集合对应的类的 泛型集合提供了更高的类型安全性和效率 |
非泛型集合-内容
System.Collections 简介
使用System.Collections.ArrayList对象
使用System.Collections.Hashtable哈希表对象
ArrayList类【数组列表】
System.Collections.ArrayList类与一维数组类似,主要有以下不同:、
- 数组的容量或元素数是固定的
- 数组可以有多个维
- 可以设置数组的下界
ArrayList:
- 容量可以根据需要动态扩展,给ArrayList添加的对象超出当前容量时,ArrayList会自动扩容为当前容量的两倍
- 通过设置ArrayList.Capacity的值可以重新分配内存和复制元素
- ArrayList具备与数组类似的方法,还具备数组没的方法,
如:添加、插入或移除元素的方法
许多需要使用数组的实例都可以使用ArrayList,相反也一样。
ArrayList的属性:Capacity、Count
ArrayList的方法:Add、Insert、Remove、RemoveAt
//引入命名空间
ArrayList arr = new ArrayList();
int a = arr.Capacity;//最多放多少个元素
int b = arr.Count;//元素的总数
//arr[0] = 1;//不能用【】放值
//arr[1] = 2;
//arr.Add(1);
//arr.Add(2);
//循环
for (int i = 0; i <9; i++)
{
arr.Add(i + 1); ;
}
arr.Capacity = 9;
listBox1.Items.Clear();
foreach (int i in arr)
{
listBox1.Items.Add(i);
}
//数组没有的方法
arr.Insert(2,22);
arr.Remove(9);
arr.RemoveAt(7);
arr.Add(99);
//和数组一样的方法
arr.Sort();
arr.Reverse();
int re = arr.IndexOf(99);
int re2 = arr.LastIndexOf(99);
ArrayList list=new
字典集合类
字典时称为映射或散列表。字典建立key【键,用来快速查找,区分大小写】与value【值,用来存放对应key的值】的对应关系,允许照某个键来访问元素
字典主要用来建立一个查找表
数 组: studentArray[0]=”zhangsan”;
哈希表:studentArray[“msd0911(键”]=”zhangsan(值”(哈希中用键访问值
ArrayList list = new ArrayList();
private void button1_Click(object sender, EventArgs e)
{
//string name = txtName.Text;
list.Add(this.txtName.Text.Trim());
this.ListMessage.Items.Add(this.txtName.Text);
this.txtName.Text = string.Empty;
}
private void btnSelect_Click_1(object sender, EventArgs e)
{
list.Sort();
int i = list.BinarySearch(this.txtSelect.Text.Trim());
if (i >= 0)
{
MessageBox.Show("查找成功" + "在我们数列中的第" + Convert.ToString(i + 1)+"项");
}
else
{
MessageBox.Show("查找失败!");
}
}
字典集合类
字典有时也称为映射或散列表。字典建立Key[键]与value[值]的对应关系,允许按照某个键来访问元素
字典主要用来建立一个查找表
.NET中的字典是System.Collections.Hashtable类【哈希表】,是一个集合类,用于处理和表现类似keyvalue的键值对:1) key通常用来快速查找(key区分大小写),value用于存储对应于key的值2) Hashtable中keyvalue键值对均为object类型,所以Hashtable可以支持任何类型的keyvalue键值对。3) 属性:Count、keys、Values4) 方法:Add、Get Enumerator、Remove
用于存储一对对密切相关的信息,然后根据其中一个信息查找或获取另一个对应的值的信息。如学生编号,学生姓名
数组: studentArray[0] =”zhangsan”;
哈希表:studentArray [“MSD0911”] =”zhangsan”;
方法:GetEnumerator
1) 枚举器(读取器。。。)
2) 移动指针:MoveNext()
3) 返回信息:MoveNext()=> bool
4) 当前行没值
5) 获取当前行的值:属性或方法
Hashtable listOfStudents = new Hashtable();
//将人名引用为Hash(或键)并将电话号码引用为值
listOfStudents.Add("Sam", "88880001");
listOfStudents.Add("Smith", " 88880002");
listOfStudents.Add("Tom", " 88880003");
System.Console.WriteLine("该校学生的数量为{0} ",listOfStudents.Count);
Console.ReadKey();
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
Hashtable hast = new Hashtable();
private void button1_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(this.textBox1.Text))
{
MessageBox.Show("请认真填写键!");
return;
}
if (string.IsNullOrEmpty(this.textBox2.Text))
{
MessageBox.Show("请认真填写值!");
return;
}
hast.Add(textBox1.Text.Trim(), textBox2.Text.Trim());
this.listBox1.Items.Clear();
foreach (string s in hast.Keys)
{
this.listBox1.Items.Add(s);
}
this.textBox1.Text = this.textBox2.Text = "";
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
this.textBox4.Text = hast[this.listBox1.Text].ToString();
}
}
Queue和Stack
Queue和Stack类是顺序列表集合类,需要将集合中的对象按照某个顺序处理时,可以使用 Queue是一个可以按照先进先出方式处理数据项目的类
Stack是一个可以按照后进先出方式处理数据项目的类
泛型
泛型类型参数(type parameters)是.NET框架的概念,用来声明泛型的标记。如:非具体的类型参数(<r>);具体的类型参数(<int>、<string>)
泛型(generic)是用类型参数声明的数据类型或方法[泛型数据类型、泛型方法] 泛型是C#语言2.0和通用语言运行时(CLR)的一个新特性。是将数据类型参数化的语法特征。
1) 声明泛型数据类型或方法时用(非具体的)类型参数
2) 在客户代码中调用时必须用具体的类型参数取代(非具体的)类型参数
3) 如: *使用泛型的类型参数T写一个类Person<T> *客户代码可以这样调用:Person<int>pl=new Person<int>()PS:在Person<T>实例中每个非具体的T都用int代替