深入.NET平台和C#编程
第四章
用集合组织相关数据
【集合概述】
将很多数据封装在一个对象中
【ArrayList类】
命名空间
:System.Collections
ArrayList类似于数组
,ArrayLists的容量是动态的,而数组是的容量是固定的
例:
如图,有一个学生类和一个枚举,在主程序中建立学员集合
![](http://student.csdn.net/attachment/201004/20/279584_1271745683biOr.gif)
//
建立班级学员的集合
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());
![](http://student.csdn.net/attachment/201004/20/279584_1271745683LpR0.gif)
【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);
}
![](http://student.csdn.net/attachment/201004/20/279584_1271745683Wb77.gif)