在说集合之前,先来个小插曲——里氏转换
——里氏转换
里氏转换的两个特性
- 子类可以赋值给父类:如果有一个地方需要父类作为参数,我们可以给一个子类代替
- 如果父类中装的是子类对象,那么可以将这个父类对象强制转换为对应的子类对象
is和as用于类型的强制转换
is——如果能转换成功,则返回true,否则返回false
//假设有两个类,一个Person类,一个Son类
//Son类继于Person类
Person p = new Son();
if(p is Son){
Son s = (Son)p;
}else{
Console.WriteLine("转换失败")
}
as——如果能转换则返回一个对应类型的对象,否则返回null
//那么上面的转化就可以这样玩儿
Person p = new Son();
Son s = p as Son;
——ArrayList集合
集合解决了数组固定长度的缺陷,ArrayList集合包容多种元素类型,也解决了数组元素类型单一的缺陷
//创建一个集合对象
ArrayList list = new ArrayList();
ArrayList的方法
- 新增元素
- Add( )——添加单个元素,末尾添加
- AddRange( )——添加集合,末尾添加,是吧集合中的每个元素提取出来添加
- Insert(指定索引,插入内容)——在指定的索引前插入单个元素
- InsertRange(指定索引,插入的集合)——在指定位置前插入一个集合
- 删除元素
- Clear( )——清空集合
- Remove(要删除的元素)——删除指定元素
- RemoveAt(下标)——删除指定下标的元素
- RemoveRange(开始位置,结束位置)——删除指定范围内的元素
- 其他方法
- Sort( )——升序排列
- Reverse()——翻转
- Contains(指定内容)——判断指定内容是否存在
ArrayList list = new ArrayList();
list.Add(1);
list.Add(2.0);
list.Add("hello");
list.Add("world");
//集合的元素数量用Count来表示,不是Length
for (int i = 0; i < list.Count; i++)
{
Console.Write(list[i]+"\t");
}
//输出 1 2 hello world
再来一个例子
//上面添加的都是一些值类型,那么我们看看添加引用类型会怎样
ArrayList list = new ArrayList();
list.Add("hello");
list.Add(new int[] { 1, 2, 3, 4 });
for (int i = 0; i < list.Count; i++)
{
Console.Write(list[i]+"\t");
}
//输出 hello System.Int32[]——这是数组的命名空间
//如果要输出的不是命名空间,则需要使用AddRange()方法添加集合
//为什么会输出命名空间呢,添加到ArrayList集合中的每个元素都会被转换成Object类型
//由于object类是所有类的父类(基类),所以才允许往集合中添加任意的数据类型
上面例子的优化
ArrayList list = new ArrayList();
list.Add("hello");
list.Add(new int[] { 1, 2, 3, 4 });
for (int i = 0; i < list.Count; i++)
{
//判断是不是由数组转换成的object[],里氏转换
if (list[i] is int[])
{
//(int[])list[i])转换成子类数组,里氏转换
for (int j = 0; j < ((int[])list[i]).Length; j++)
{
Console.Write(((int[])list[i])[j]+"\t");
}
}
else {
Console.Write(list[i]+"\t");
}
}
//输出 hello 1 2 3 4
//上面这个过程就发生了拆箱和装箱的操作,影响性能,但是没办法
//拆箱:引用类型转换成值类型
//装箱:值类型转换成引用类型
//拆箱和装箱的前提都是要有继承关系
集合的长度问题:
每次集合中实际包含的元素个数(count)超过了可以包含的元素的个数(capcity)的时候,
集合就会向内存中申请多开辟一倍的空间,来保证集合的长度一直够用。
Hashtable集合
Hashtable集合是一个键值对集合,在键值对集合中是根据键去找值的,键必须是唯一的,Count获取Hashtable集合中键值对的数目
- Hashtable的新增数据
- Add——这个方法添加相同的键会抛异常,所以一般先进行Contains判断
- [“键”]=值——这样的形式添加数据,如果计划和中已经有了这个键,则原有的键会被覆盖
Hashtable _hs = new Hashtable();
if (!_hs.Contains("姓名")) {
_hs.Add("姓名", "张三");
}
_hs["性别"] = "男";
遍历Hashtable的方法
foreach(var 集合中的每一项 in 集合名称){
}
例子1、
Hashtable ht = new Hashtable();
ht["name"] = "HelloWorld";
ht["hobby"] = "Programming";
foreach (var key in ht.Keys)
{
Console.Write(hs[key]+"\t");
}
//输出: HelloWorld Programming
//ht.Keys指定了键组成的集合,key在每次循环中代表键集合中的值
例子2、
Hashtable ht = new Hashtable();
ht["name"] = "HelloWorld";
ht["hobby"] = "Programming";
foreach (var value in ht.Values)
{
Console.Write(value+"\t");
}
//输出: HelloWorld Programming
//ht.Values指定了值组成的集合,key在每次循环中代表值集合中的值
- Hashtable集合的方法
- Contains和(键名)——判断是否拥有指定键
- ContainsKey(键名)——判断是否拥有指定键(常用这个)
- Clear()——清空
- Remove(键名)——移除
时间: 2025-01-14 08:29:25