前言
集合(Collection)类服务于不同的目的,如为元素动态分配内存,基于索引访问列表项等等。这些类创建 Object 类的对象的集合。在 C# 中,Object 类是所有数据类型的基类。
1. ArrayList 非泛型集合
ArrayList集合可以存储任意类型,集合长度可以自动增长
//命名空间
using System.Collections
//创建ArrayList集合
ArrayList list = new ArrayList();
/* 添加元素 可以添加任意类型 */
list.Add(true); //布尔类型
list.Add(1); //数字类型
list.Add("小源"); //字符串类型
list.Add('男'); //字符类型
list.Add(1.2); //浮点类型
list.AddRange(new int[] {1,2,3,4,5,6}); //数组类型
/* 删除元素 */
list.Clear(); //清空集合中所有元素
list.Remove(true); //删除指定元素名的元素
list.RemoveAt(0); //删除指定索引的元素
list.RemoveRange(0, 3); //根据下标去移除一定范围的元素
/* 插入元素 */
list.Insert(1,"插入的内容"); //在指定的位置插入一个元素
list.InsertRange(0,new string[]{"张三","李四","王五"}); //在指定的位置插入一个数组
/* 修改元素 */
list[0]="520";
/* 查询元素 */
bool iRet = list.Contains('男'); //判断是否包含某个指定的元素
/* 遍历ArrayList集合 通过for或foreach遍历集合 */
for(int i=0;i<list.Count;i++)
{
Console.WriteLine(list[i]);
}
foreach(object time in list)
{
Console.WriteLine(time);
}
2. Hashtable 非泛型集合
Hashtable集合 通常成为哈希表,根据键(Key) 可以查找到相应的值(Value)
//命名空间
using System.Collections
/* 创建Hashtable 哈希表集合 */
Hashtable ht = new Hashtable();
/* 添加元素 不能添加重复键Key,但可以有重复的值Value */
ht.Add("S10001","小孙");
ht.Add("S10002","小王");
/* 删除元素 */
ht.Remove(key); //通过键删除Key
ht.Clear(); //移除所有元素
/* 查询元素 */
bool iRet = ht.Contains(key); //判断哈希表是否包含特定键key
/* 遍历Hashtable 哈希表集合 */
/* 遍历键 */
Console.WriteLine();
foreach (string key in ht.Keys)
{
Console.WriteLine(key);
}
Console.WriteLine();
/* 遍历值 */
foreach (string values in ht.Values)
{
Console.WriteLine(values);
}
Console.WriteLine();
/* 遍历键值 */
foreach (DictionaryEntry de in ht)
{
Console.WriteLine(de.Value);
Console.WriteLine(de.Key);
}
3. List< T > 泛型集合
List 泛型集合描述:
- 不会强行对值类型进行装箱和拆箱。
- 可以使用一个整数索引访问此集合中的元素;索引从 零开始。
- 执行得更好并且是类型安全的。
- 可以接收null空引用(VB中的Nothing)。
- 允许重复元素。
//命名空间
using System.Collections.Generic;
/* 创建泛型集合 类型中可以是任意类型 */
List<类型> 集合名 = new List<类型>();
/* 添加元素 */
集合名.Add(Value);
/* 删除元素 */
集合名.Remove(GameObject item); //清空集合指定的子元素
集合名.RemoveAt(索引); //删除指定索引位置的数据
集合名.Clear(); //清空集合
/* 查询元素 */
集合名[索引]; //取出指定索引位置的数据
集合名.Count; //集合的长度
/* 修改元素 */
集合名[索引]=新值; //给指定索引的数据重新赋值
/* 遍历List<>泛型集合 */
foreach(类型 time in 集合名)
{
Console.WriteLine(time);
}
for(int i = 0; i < 集合名.Count; i++)
{
Console.WriteLine(集合名[i]);
}
4. Dictionary<T,V> 字典泛型集合
Dictionary泛型集合描述:
- 从一组键(Key)到一组值(Value)的映射,每一个添加项都是由一个值及其相关连的键组成
- 任何键都必须是唯一的
- 键不能为空引用null(VB中的Nothing),若值为引用类型,则可以为空值
- Key和Value可以是任何类型(string,int,custom class 等)
//引用命名空间
using System.Collections.Generic
/* 创建Dictionary集合 */
Dictionary<键类型,值类型> 集合名 = new Dictionary<类型,类型>();
/* 添加数据 键必须是键的数据类型,值必须是值的数据类型*/
集合名.Add(键,值);
/* 删除数据 通过键删除元素*/
集合名.Remove(键);
/* 通过Key查询元素是否存在 */
bool iRet = 集合名.ContainsKey(键);
/* 遍历字典集合 */
/* 遍历键*/
foreach (键类型 values in 集合名.Keys)
{
Console.WriteLine(values);
}
/* 遍历值 */
foreach (值类型 values in 集合名.Values)
{
Console.WriteLine(values.具体属性(值));
}
/* 遍历键值*/
foreach (KeyValuePair<键类型,值类型> values in 集合名)
{
Console.WriteLine(values.Key);
Console.WriteLine(values.Value.具体属性(值));
}
5. 非泛型集合和泛型集合对比
异同点 | List< T > | ArrayList |
---|---|---|
不同点 | 添加元素时类型严格检查 | 可以增加任何类型 |
添加和读取值类型元素时,无需装箱拆箱 | 添加和读取值类型元素时,需要装箱拆箱 | |
相同点 | 通过索引访问集合的元素 | |
添加对象方法相同 | ||
通过索引删除元素 |
异同点 | Dictionary< K,V > | Hashtable |
---|---|---|
不同点 | 增加元素时类型严格检查 | 可以增加任何类型 |
无需装箱拆箱 | 需要装箱拆箱 | |
相同点 | 通过K获取Value | |
添加对象方法相同 | ||
遍历方法相同 |