c#基础三 常用数据类型的用法(泛型 泛型集合)
四:泛型
定义和引用:
泛型是具有占位符的类,接口,结构或方法。它与普通类的区别是多了一个或多个表示类型的占位符,这些占位符用尖括号表示。如
1 public class MyClass<T>
2
3 {
4
5 public T MyProp {get; set;}//定义属性MyProp
6
7 public void Print()
8
9 {
10
11 Console.WriteLine(MyProo);
12
13 }
14
15 }
T表示类型的占位符,它表示某种类型,只不过这种类型在创建泛型类的实例时才用实际类型来替换。用int类型创建该泛型并调用其属性和方法代码入下:
MyClass<int> myClass = new MyClass<int>();
myClass.MyProp = 16;
myClass.Print();
定义一个类或方法时,可以用泛型T代表任何一种类型,而在引用时再具体指定类型,从而大大简化了程序员编写代码的复杂度。
可空类型的泛型:
可空类型是泛型结构Nullable<T>的实例表示。
(1) 可空类型表示可被赋值为null值的值类型变量,引用类型虽然支持null值,但不能用该类型创建基于引用类型的null类型。
(2) 语法”T?”是泛型 “Nullable<T>”的简写,此处的T为值类型,这两种形式可以互换,如Nullable<int> 也可以写为 int?.
int? a =0; //等价于 Nullable<int> a =0;
double? d = 4.014;//等价于 Nullable<double> d = 4.014;
(3) 判断可空类型的变量是否为null,可以用HasValue属性,若变量不是null则返回true,是null则返回false
GetValyeOrDefault方法,若变量不是null则返回值,是null则返回该类型的默认值
使用”??”运算符可以为可控类型分配默认值。例如:
int? x = null;
int y = x?? -1;//若x的值为null,就将默认值-1赋值给y
五:泛型集合
集合
数组的优点:在内存中连续存储,可以快速而容易的从头到尾便利元素,和快速修改元素等
缺点:创建时必须要指定数组变量的大小,在两个元素间添加元素也比较困难。
ArrayList 是命名空间System.Collections下的一部分,大小可以按需动态增加的数组实现IList接口。可以随意的添加、插入或移除某一范围元素,比数组方便。
由于实现了IList接口,所以ArrayList提供添加,插入或移除某一范围元素的方法;
声明一集合变量时,可以用接口”IList arrayAnimal”,也可以直接声明“ArrayList arrayAnimal”
ArrayList缺点:不管什么对象都接受,因为在它眼里所有元素都是Object,但在执行时,foreach(Object item in ArrayList)需要明确集合中的元素是具体的Object类型,如:Animal类型,而如果之前加入的是值类型或者字符串类型,就会报类型不匹配错误,因此ArrayList不是类型安全的。而且需要装箱 拆箱,带还很大的性能损耗。
普通的集合可以用System下的Array类和System.Collections命名空间下的类添加,移除和修改集合类中的元素,但是由于这种方法无法在编译代码前确定数据的类型,运行时很可能需要频繁的装箱与拆箱操作进行数据类型的转换,导致运行效率低。所以实际项目中一般用System.Collections.Generic下的泛型集合类对集合进行操作!常见的泛型集合类与对应的非泛型集合类:
泛型集合类 |
非泛型集合类 |
泛型集合用法实例 |
List<T> |
ArrayList |
List<string> dinosaurs = new List<string>(); |
Dictionay<Tkey,Tvalue> |
Hashtable |
Dictionary<string,string> d = new Dictionary<string,string>()’ |
Stack<T> |
Stack |
Stack<string> s = new Stack<string>(); |
SortedList<Tkey,TValue> |
SortedList |
SortedList<string,string> list = new SortedList<string,string>(); list.add(“txt”,”notepad.exe”); list.TryGetValue(“tif”,out value); |
哈希集合:
哈希集合(HashSet)用于进行数学集合运算。HashSet<T>泛型类提供了高性能的数学集合运算,其容量将随该对象中元素的添加而自动增大。
h1.UnionWith(h2)//求并集。
h1.IntersectWith(h2)//求交集
h1.ExceptWith(h2)//只保留h1中没有与h2对应的元素
h1.SymmetricExceptionWith(h2)//求余集
此外 还有其他方法如判断两个集合是否相等、是否重叠、以及一个集合是另一个集合的子集或者超集,求和求平均值,最大数最小数。
列表和排序列表
列表是指一系列元素的组合,列表中可以有重复的元素。
List<T>泛型类表示可通过索引访问的强类型对象列表,该类提供了对列表进行搜索、排序和操作的方法。常用方法:
Add方法:将指定的元素添加到列表中
Insert方法:在列表中的某个位置插入一个新元素,从0开始
Contains方法:测试列表中是否存在某个元素
Remove方法:从列表中移除带有指定键的元素
排序列表SortedList<T>的用法和列表List<T>的用法相同,区别仅是排序列表中保存的是对列表中的元素按升序排序后的结果。
链表:
列表中可以有重复的元素。
LinkedList<T>为双向链表,LinkedList<T>对象中的每个节点都属于LinkedListNode<T>类型,每个节点又指向其Next节点和Previous节点。
若LinkedList<T>为空,则First和Last属性为Null
string[] words = { "a", "b", "c" };
LinkedList<string> sentence = new LinkedList<string>(words);
sentence.AddFirst("dog");//结果为"dog","a", "b", "c"
LinkedListNode<string> mark1 = sentence.First;//结果为"dog"
sentence.RemoveFirst();//结果为"a", "b", "c"
sentence.AddLast(mark1);////结果为"dog","a", "b", "c" ,"dog"
LinkedListNode<string> current = sentence.Find("b");
sentence.AddAfter(current, "lazy");//结果为"a", "b","lazy", "c","dog"
字典与排序字典
Dictionary<Tkey,TValue>提供了从一组键到一组值的映射,一个字典中不能有重复的键。可以自动增加容量。Dictionary<Tkey,TValue>的每个元素是一个键值对:KeyValuePair< Tkey,TValue >
Add方法:将带有指定键和值的元素添加到字典中
TryGetValue方法:获取与指定的键相关联的值
ContainsKey方法:确定字典中是否包含指定的键
Remove方法:从字典中移除带有指定键的元素
常用代码:

排序字典SortedDictionary<Tkey,TValue>的用法和字典的用法相同,区别仅是排序字典中保存的是按键进行升序排序后的结果。
队列:
Queue<T>泛型类表示对象的先进先出集合,在接受顺序存储消息方面非常有用,可以保存null值并且允许有重复的元素
Enquene方法:将指定元素插入队尾
Dequeue方法:队列首元素出列
堆栈:
Stack<T>泛型表示同类型实例的大小可变的先进后出LIFO集合,可以保存null值并且允许有重复的元素
Push方法:将指定元素插入栈顶
Pop方法:弹出栈顶元素