线性链表测试方法简介
创始人
2024-05-01 12:41:31
0

我们可以添加一些整型值到进行线性链表测试:

  1. public void Run(){  
  2.     LinkedList ll = new LinkedList();  
  3.     for ( int i = 0; i <  10; i ++ ){  
  4.        ll.Add(i);  
  5.     }  
  6.  
  7.     Console.WriteLine(ll);  
  8.     Console.WriteLine("  Done. Adding employees...");  
  9. }  

如果你对这段代码进行测试,它会如预计的那样工作:

  1. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9  
  2. Done. Adding employees... 

然而,因为这是一个Object类型的集合,所以你同样可以将Employee类型添加到集合中。

  1. ll.Add(new Employee("John"));  
  2. ll.Add(new Employee("Paul"));  
  3. ll.Add(new Employee("George"));  
  4. ll.Add(new Employee("Ringo"));  
  5.  
  6. Console.WriteLine(ll);  
  7. Console.WriteLine("  Done."); 

输出的结果证实了,整型值和Employee类型都被存储在了同一个集合中。

  1. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9  
  2.   Done. Adding employees...  
  3. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, John, Paul, George, Ringo  
  4. Done. 

虽然看上去这样很方便,但是负面影响是,你失去了所有类型安全的特性。因为线性链表需要的是一个Object类型,每一个添加到集合中的整型值都被隐式装箱了,如同 IL 代码所示:

  1. IL_000c:  box        [mscorlib]System.Int32  
  2. IL_0011:  callvirt   instance void ObjectLinkedList.LinkedList::Add(object) 

同样,如果上面所说,当你从你的列表中取出项目的时候,这些整型必须被显式地拆箱(强制转换成整型),Employee类型必须被强制转换成 Employee类型。

  1. Console.WriteLine("The fourth integer is " + Convert.ToInt32(ll[3]));  
  2. Employee d = (Employee) ll[11];  
  3. Console.WriteLine("The second Employee is " + d); 

这些问题的解决方案是创建一个类型安全的集合。一个 Employee 线性链表将不能接受 Object 类型;它只接受 Employee类的实例(或者继承自Employee类的实例)。这样将会是类型安全的,并且不再需要类型转换。一个整型的线性链表,这个链表将不再需要装箱和拆箱的操作(因为它只能接受整型值)。

作为示例,你将创建一个 EmployeeNode,该结点知道它的data的类型是Employee。

  1. public class EmployeeNode {  
  2.     Employee employeedata;  
  3.     EmployeeNode employeeNext;  

Append 方法现在接受一个 EmployeeNode 类型的参数。你同样需要创建一个新的 EmployeeLinkedList ,这个链表接受一个新的 EmployeeNode:

  1. public class EmployeeLinkedList{  
  2.     EmployeeNode headNode = null;  

EmployeeLinkedList.Add()方法不再接受一个 Object,而是接受一个Employee:

  1. public void Add(Employee data){  
  2.     if ( headNode == null ){  
  3.        headNode = new EmployeeNode(data);}  
  4.     else{  
  5.        headNode.Append(new EmployeeNode(data));  
  6.     }  

类似的,索引器必须被修改成接受 EmployeeNode 类型,等等。这样确实解决了装箱、拆箱的问题,并且加入了类型安全的特性。你现在可以添加Employee(但不是整型)到你新的线性链表中了,并且当你从中取出Employee的时候,不再需要类型转换了。

  1. EmployeeLinkedList employees = new EmployeeLinkedList();  
  2. employees.Add(new Employee("Stephen King"));  
  3. employees.Add(new Employee("James Joyce"));  
  4. employees.Add(new Employee("William Faulkner"));  
  5. /* employees.Add(5);  // try to add an integer - won't compile */ 
  6. Console.WriteLine(employees);  
  7. Employee e = employees[1];  
  8. Console.WriteLine("The second Employee is " + e); 

这样多好啊,当有一个整型试图隐式地转换到Employee类型时,代码甚至连编译器都不能通过!

但它不好的地方是:每次你需要创建一个类型安全的列表时,你都需要做很多的复制/粘贴 。一点也不够好,一点也没有代码重用。同时,如果你是这个类的作者,你甚至不能提前欲知这个链接列表所应该接受的类型是什么,所以,你不得不将添加类型安全这一机制的工作交给类的使用者---你的用户。

这样,线性链表测试就完成了。

【编辑推荐】

  1. C# winForm自定义鼠标样式的两种方法
  2. C#自定义消息框的设置图解
  3. 掌握C#自定义泛型类:从初始化说起
  4. C#存储过程的循序渐进
  5. 存储过程的优势及其调用方法介绍

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...