为什么会有集合?
为了弥补数组动态添加元素和删除元素不足,集合优点:长度可变、动态维护。
1.ArrayList:类似于数组,可以直观地动态维护,它的容量可以根据需要自动扩充,它的索引会根据程序的扩展而重新进行分配和调整.
下面是代码的操作实现:
//创建两个用户对象
User jack = new User("Jack","18");
User tom = new User("Tom","20");
//创建ArrayList集合
ArrayList userList = new ArrayList();
//将对象添加到ArrayList
userList.Add(jack);
userList.Add(tom);
//取出单个元素
//需要转换类型
User user = (User)userList[0];
Console.WriteLine(user.Username);
//遍历ArrayList中的元素
//和java不同之处,获取长度java用Size(),c#用Count
for(int i=0;i<userList.Count;i++){
//需要转换类型才能取出值
user = (User)userList[i];
Console.WriteLine(user.Username);
}
//删除ArrayList中的元素
userList.Remove(jack); //通过对象名删除
userList.RemoveAt(0); //通过索引删除
userList.Clear(); //全部清空
Console.ReadLine();
ArrayList删除细节:ArrayList的索引会自动分配和调整,假设集合有三个元素,删掉第1个元素后第2个元素的索引就变成0.
2.Hashtable(哈希表):通常称为哈希表,也有人称它为“字典”。哈希表的数据是通过键(key)和值(value)来组织的。
哈希表也属于System.Cpllections命名空间,它的每一个元素都是一个键值对。
接下来是代码实现:
//建立用户集合
Hashtable users = new Hashtable();
//初始化两个用户对象
User jack = new User("Jack", "18");
User tom = new User("Tom", "20");
//HashTable添加元素
users.Add(jack.Username,jack);
users.Add(tom.Username, tom);
//HashTable获取单个元素(通过键获取值)
User user = (User)users["Jack"];
Console.WriteLine(user.Username);
//HashTable删除元素
users.Remove("Jack");
//遍历HashTable的key
foreach(Object obj in users.Keys){
user=(User)users[obj];
Console.WriteLine(user.Username);
}
//遍历HashTable的value
foreach (Object obj in users.Values)
{
user = (User)obj;
Console.WriteLine(user.Username);
}
//使用对象遍历
foreach(DictionaryEntry en in users){
Console.WriteLine(en.Key);
Console.WriteLine(en.Value);
}
总结:ArrayList和HashTable存储的数据类型都会被转换为Object类型,可以放入任何类型数据,类型安全性弱,而且要频繁地转换类型,使用泛型集合能很好地解决这两个问题。
泛型:C#2.0中的新特性,通过泛型可以定义类型安全的数据类型,最常见的应用就是创建集合类,可以约束集合类中的元素类型。比较典型的集合是List<T>和Dictionary<K,V>。
泛型集合List<T>和ArrayList的用法基本一样,不同点如下:
1.泛型集合对保存元素做类型约束,而ArrayList可以添加任何类型
2.泛型集合添加和读取值无需装箱拆箱,ArrayList添加和读取值类型元素需要拆箱、装箱。
相同点如下:
1.通过索引访问集合中的元素
2.添加元素方法相同
3.删除元素方法相同