day11
泛型
装箱
int a=6;
float b =14f
object obj =b;
,拆箱
float b =(float)obj;
泛型实现交换
能够将类型作为参数传递,也就是在创建类型的时候用一个特定的符号例如T作为一个占位符,代替时机的类型,等到时候在实例化的时候再用一个实际的类型来代替
public static Swap<T>(ref T value0, ref T)
{
T temp =value0;
value0 =value1;
value1 =temp;
}
↑ 可以保护类型安全并提高性能
降低强制转换操作成本和风险
泛型方法
是使用泛型类型参数声明的方法,如果方法中存在某些参数的类型不明确的时候可以使用
类型不明的参数用泛型类型参数代替
访问修饰符 返回值类型<反省类型列表>(参数列表)
{
//方法体
}
泛型参数
泛型类型参数可以有多个
可以是编译器认识的任何数据类型
泛型类型参数命名要遵守命名规则
使用描述性名称命名泛型类型,使用T作为前缀
如果单个字母能表述就用单个字母大写
↓约束
关键词Where
where T:struct 是值类型/小数,整数,char,bool,struct
where T:class 是引用类型
Where T:new()是有一个无参数的构造方法,如果有多个约束new要放在最后
Where T:基类名 表示这个泛型是该基类或者其他派生类
Where T:接口名 表示泛型是实现了该接口的类型
//可以对多个参数应用约束,也可以对同一参数进行多个约束
通过约束类型参数,可以增加约束类型及其继承层次结构中的所有类型所支持的允许操作和方法调用的数量
泛型方法的调用
public static string ConbineToString<T>(T value1,T value2)
{
return value1.ToSting()+value2.ToString();
}
public static void Main(string[] args)
{
console.WriteLine(CombineToString<int>(234,56));
}
//↓调用方法时,有些时候泛型类型可以省略
console.WriteLine(combineToString(234,56));
泛型方法的泛型重载
void DoWork(){}
void DoWork<T>(){}
void DoWork<T,U>(){}
//**泛型类与泛型接口**
interface ITest<T>
{
T getText(T t);
}
class Person<T>
{
T name;
}
↓类的泛型重载
class Person{}
class Person<T,U>{T name; U age;}
Person<string> xiaoming =new Person<string>();
集合
数组是其中一种
表示一组具有某种性质的数学元素,在程序里就是一组具有相同性质的对象。
是一个特殊的类,可以通过索引访问集合成员,也可以通过键‘来访问
大小可以动态调整,可以在运行的时候添加或者删除元素
分为泛型和非泛型
泛型一般位于system.collection.generic
非泛型一般位于Sytem.Collections
System.Collections.Specialized里也包含一些有用的集合类
常见的集合
↓system。collections 命名空间的类
动态数组ArrayList
可以被单独索引的对象的有序集合,
可以使用索引在指定位置添加或删除,
会自动调整他的大小,
也允许动态内存分配增加搜索排序等等
#region ArrayList/list<T>
ArrayList array = new ArrayList();
//添加
array.Add(1);
array.Add(3);
//插入
array.Insert(0, 4);
//移除某个元素
array.Remove(2);
//通过索引移除
array.RemoveAt(0);
//翻转元素
array.Reverse();
//是否包含,包含返回true,不包含返回fales
bool res = array.Contains(3);
//清空数组
array.Clear();
//集合长度
int length = array.Count;
//返回某个元素索引
int index = array.IndexOf(3);
//List<int> list = new List<int>();
//list.Add(6);
//其他使用方法与ArrayList一致
Child student1 = new Child(1,"王小明","男",20);
ArrayList list = new ArrayList();
list.Add(student1);
bool res = list.Contains("王小明");
#endregion
堆栈stack
推入弹出
后进先出,本质上是一种线性结构
容量通过重新分配按需自动增加
可以接受null作为有效值
允许有重复的元素
↑不安全的
方法:
Clear(移除所有对象)
Count(获取栈中包含的元素)
Stack<int> stack = new Stack<int>();
//加入堆栈,从顶上放进去
stack.Push(6);
stack.Push(7);
stack.Push(8);
//出栈,8拿出最底下的
int num = stack.Pop();
//返回位于顶端的对象但是不移除
num = stack.Peek();
//是否包含
bool srt = stack.Contains(6);
队列queue
先进先出,最先进去的最先出
可以接受null作为有效值、
允许重复元素
↑不安全的
方法:
Peek()返回位于queue开始处的对象但是不移除
Contains()确定某元素是否在queue中
Clear()从queue中移除所有对象
Count()获取queue中所包含的元素数
#region Queue/队列
Queue<int> queue = new Queue<int>();
//入队,从尾端进
queue.Enqueue(1);
queue.Enqueue(5);
queue.Enqueue(4);
queue.Enqueue(9);
//出队,从头出 先加啥先出啥
num = queue.Dequeue();//1
#endregion
哈希表Hashitable
使用键访问集合中的元素
处理和表现类似的key_value的键值对的集合
key和value都是object类型
key值是唯一的,区分大小写
value可以是值类型也可以是对象
方法:
Add()把指定的键和值添加到哈希表里
Clear()清空哈希表
ContainsKey()判断是否包含键(key
ContainsValue()判断是否包含元素(value
Remove()从哈希表中移除带有指定键的元素
Keys()获取一个Icollection,包含哈希表中的键
Values()获取一个ICollection,包含哈希表中的值
Hashtable hashtable = new Hashtable();
//增加
hashtable.Add("小兰","对象");
hashtable.Add("小虎", "对象");
hashtable["小龙"] = "对象";
↓system.collection.generic命名空间内的
dictionary<Tkey,lTvalue>字典
相当于哈希表
key和value的类型由泛型指定
#region 字典 dictionary
Dictionary<int, string> dic = new Dictionary<int, string>();
dic.Add(1,"小兰");
dic.Add(2, "小虎");
dic[3] = "小龙";
//判断是否包含键(key
res = dic.ContainsKey(1);
//判断是否包含元素(value
res = dic.ContainsValue("小兰");
//根据键移除
dic.Remove(1);
//移除全部
//dic.Clear();
//遍历字典所有key,无序的
foreach (int item in dic.Keys)
{
Console.WriteLine(item);
}
foreach (string item in dic.Values)
{
Console.WriteLine(item);
}
#endregion
List< T >
和动态数组一样
需要声明集合内部的数据类型
安全
不需要拆箱装修
接口说明
IEnumerator< T >
定义了方法GetEnumerator(),返回一个实现了IEnumerator接口的枚举,如果用foreach语句,就需要实现该接口
ICollection< T >
由泛型集合类实现,使用这个接口可以获取集合中的元素个数(count),把集合复制到数组(CopyTo()),还可以添加和删除元素
IList< T >
用于可通过为止访问其中元素列表,这个接口定义了一个索引器,可以在集合指定位置插入或者删除某些项。IList接口派生自ICollection接口
IDictionary<TKey,TValue>
由包含键和值的泛型集合类实现,使用这个接口可以访问所有的键和值。使用键类型的索引器可以访问某些项,也可以添加或删除某些项(←字典