第四章 用集合组织相关数据

用集合组织相关数据

【集合概述】

将很多数据封装在一个对象中

【ArrayList类】

命名空间 :System.Collections

ArrayList类似于数组 ,ArrayLists的容量是动态的,而数组是的容量是固定的

 

// 建立班级学员的集合

ArrayList sturdents = new ArrayList();

 

Student zhangsan = new Student(" 张三" ,Genders.Male,20," 足球" );

Student Lisi = new Student(" 李四" , Genders.Female, 18, " 编程" );

 

 

// 添加元素演示

 

students.Add(zhangsan);

students.Add(Lisi);

 

// 打印集合数目

MessageBox .Show(string.Format(" 共包括{0} 个学员。" ,

    students.Count.ToString()));

 

存取ArrayList中的单个元素:

可以通过索引来访问ArrayList集合,ArrayList可以添加类型的对象,添加到ArrayList集合中会转换为Object类型.所以访问元素时必须将其转换为原类型.

 

Student stu1 = (Student)students[1];

stu1.SayHi();

 

删除 ArrayList中的元素,当删除一个元素后,集合自动更新下标(索引删除元素将存在风险)

删除元素有三种方式 :

1.     通过 RemoveAt(intindex)方法删除指定下标的元素.

2.     通过 Remove(object value)方法删除指定对象名的元素.

3.     通过 Clear()方法清除集合的所有元素.

 

// 删除students集合中的元素

students.RemoveAt(1);

students.Remove("zhangsan");

students.Clear();

 

遍历ArrayList中的数组

 

for (int i = 0; i < sturdents.Count; i++)

{

    Student stu = (Student)students[i];

    stu.SayHi();

}

 

 

foreach (Student student in students)

{

    Student stu = (Student)student;

    stu.SayHi();

    MessageBox.Show(stu.Name);

}

 

 

【HashTable类】

命名空间 :System.Collections

HashTable 哈希表,键值对集合(key,value),通过key可以找到value.

 

例:

Hashtable students = new Hashtable();

 

Student zhangsan = new Student(" 张三" , Genders.Male, 30, " 足球" );

Student Lisi = new Student(" 李四" , Genders.Male, 28, " 唱歌" );

 

// 添加元素演示使用学生名字作为Key

 

students.Add(zhangsan.Name,zhangsan);

students.Add(Lisi.Name,Lisi);

 

// 打印集合数目

MessageBox .Show(string.Format(" 共包括{0} 个元素。" ,students.Count.ToString()));

 

获取HashTable的元素:

可以通过Key获取具体的值,同样由于值的类型是Object型,所以当得到一个值时也需要通过类型转换为正确的类型.

Student stu = (Student)students[" 张三" ];

stu.SayHi();

 

 

遍历 HashTable元素:

由于 HashTable不能使用索引访问,所以哈希表只能Foreach()方法

 

// 通过students.Value遍历,而不是students对象本身

//Values 属性获取哈希表中的所有值,还可通过keys属性遍历出所有的键值

foreach (Student student in students.Values)

{

    Student stus = (Student)student;

    stus.SayHi();

    Console.WriteLine(stus.Name);

}

 

 

删除哈希表的元素:

删除一个元素使用它的key值,使用Reover()和Clear()方法

 

students.Remove(" 张三" );

students.Clear();

 

 

【泛型集合】

通过泛型可以定义安全的数据类型,最显著的应用就是创建集合类.

泛型的两大优点:

1.     性能高,传统集合在添加的元素是Object型,如果添加一个值类型的数据,就需要把它转换为引用类型,取出一个元素也要转回原类型,这就需要拆箱装箱操作(占用CPU),而泛型无需转型操作.

2.     类型安全,泛型集合对存储对象作了类型约束.

 

【List<T>】

命名空间 :System.Collections.Generic

<T>可以对集合中的对象进行约束 ,T表示集合中管理元素的类型,泛型集合必须实例化.

可以替换 ArrayList

 

// 创建学生对象

Student zhangsan = new Student(" 张三" , Genders.Male, 30, " 足球" );

Student Lisi = new Student(" 李四" , Genders.Male, 28, " 唱歌" );

Student wangwu = new Student(" 王五" , Genders.Male, 28, " 唱歌" );

 

// 实例化List<T>,类型为Student

List <Student> stu = new List<Student>();

 

// 向stu泛型集合中添加元素

stu.Add(zhangsan);

stu.Add(Lisi);

stu.Add(wangwu);

 

//For and Foreach 遍历stu

for (int i = 0; i < stu.Count; i++)

{

    Console.WriteLine(stu[i].Name);

}

 

foreach (Student st in stu)

{

    Console.WriteLine(st.Name);

}

 

// 删除元素通过索引或对象名

stu.RemoveAt(1);

stu.Remove(wangwu);

 

// 打印元素个数

Console .WriteLine(stu.Count.ToString());

 

【Dictionary<K,V>】

Dictionary<K,V>具有泛型的全部特点 ,编译时检查类型约束,存储方式与哈希表存储方式类似,也是通过键值对保存元素.

 

// 创建学生对象

Student zhangsan = new Student(" 张三" , Genders.Male, 30, " 足球" );

Student Lisi = new Student(" 李四" , Genders.Male, 28, " 唱歌" );

Student wangwu = new Student(" 王五" , Genders.Male, 28, " 唱歌" );

 

// 实例化Dictionary泛型集合

Dictionary <string, Student> stu = new Dictionary<string, Student>();

 

// 添加元素,使用姓名作为KEY

stu.Add(zhangsan.Name,zhangsan);

stu.Add(Lisi.Name,Lisi);

stu.Add(wangwu.Name,wangwu);

 

// 打印集合个数

Console .WriteLine(stu.Count.ToString());

 

// 通过Key获取元素

Student stu1 = stu[" 张三" ];

stu1.SayHi();

 

// 删除元素因为没有索引,只能通过key删除元素

stu.Remove(" 王五" );

 

// 遍历sut,因为没有索引,所有只能用Forcach遍历

foreach (Student st in stu.Values) // 遍历Values与HashTable类似

{

    st.SayHi();

    Console.WriteLine(st.Name);

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值