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方法:从字典中移除带有指定键的元素

  常用代码: 

View Code

  排序字典SortedDictionary<Tkey,TValue>的用法和字典的用法相同,区别仅是排序字典中保存的是按键进行升序排序后的结果。

队列:

  Queue<T>泛型类表示对象的先进先出集合,在接受顺序存储消息方面非常有用,可以保存null值并且允许有重复的元素

  Enquene方法:将指定元素插入队尾

  Dequeue方法:队列首元素出列

堆栈:

  Stack<T>泛型表示同类型实例的大小可变的先进后出LIFO集合,可以保存null值并且允许有重复的元素

  Push方法:将指定元素插入栈顶

  Pop方法:弹出栈顶元素

posted on 2012-03-09 20:30  +Hansen+  阅读(995)  评论(0)    收藏  举报

导航