创建泛型类

首先介绍一个一般的,非泛型的简化链表类,可以包含任意类型的对象,以后再把这个类转化为泛型类.

在立案表中,一个元素引用下一个元素.所以必须创建一个类,他将对象封装在链表中,并引用下一个对象.类LinkedListNode包含一个属性value,该属性用构造函数初始化,另外,LinkedlistNode类包含对链表中下一个元素和上一个元素的引用,这些元素都可以从属性中访问.

public class LinkedListNode

{

public LinkedListNode(object value)

{

this.Value = value;

}

public object Value { get; internal set; }

public LinkedListNode Next { get; internal set; }

public LinkedListNode Prev { get; internal set; }

}

再来看LinkedList类

public class LinkedList : IEnumerable

{

public LinkedListNode First { get; private set; }

public LinkedListNode Last { get; private set; }

public LinkedListNode AddLast(object node)

{

var newNode = new LinkedListNode(node);

if (First==null)

{

First = newNode;

newNode.Prev = Last;

Last = First;

}

else

{

LinkedListNode previous = Last;

Last.Next = newNode;

Last = newNode;

Last.Prev = previous;

}

return newNode;

}

public IEnumerator GetEnumerator()

{

LinkedListNode current = First;

while (current!=null)

{

yield return current.Value;

current = current.Next;

}

}

}

这个类包含LinkedListNode类型的first和last属性,他们分别标记了链表的头尾.AddLast()方法在链表层添加一个新元素.首先创建一个LinkedListNode类型的对象.如果连彪是空的,first和last属性就设置为改新元素;否则,就把新元素添加为链表中的最后一个元素.该类还实现了一个接口了,后面介绍.

接下来我们在main函数中使用LinkedList类.

var list1 = new LinkedList();

list1.AddLast(2);

list1.AddLast(3);

list1.AddLast("6");

foreach (int item in list1)

{

Console.WriteLine(item);

}

Console.ReadKey();

创建一个LinkedList类的对象,添加两个整数类型而后一个字符串类型.整数类型要转换为一个对象,所以要执行装箱操作.通过foreach循环可以实现拆装箱操作.上述代码会出现一个异常,因为把子弟三个元素强制转换为int时会失败.

接下来创建链表的泛型版本

public class LinkedListNode<T>

{

public LinkedListNode(T value)

{

this.Value = value;

}

public T Value

{

get;

private set;

}

public LinkedListNode<T> Next { get; internal set; }

public LinkedListNode<T> Prev { get; internal set; }

}

泛型类的定义与一般类类似,只要使用泛型类型声明.之后,泛型类型就可以在类中用作一个字段程艳,或者方法的参数类型.LinkedListNode类用一个泛型类型T声明.属性Value的类型是T,而不是object.构造函数也变为可以接受T类型的对象.也可以返回和设置泛型类型,所以属性Next和prev的类型是LinkedListNode<T>.

下面把LinkedList类也改为泛型类

public class LinkedList<T> : IEnumerable<T>

{

public LinkedListNode<T> First { get; private set; }

public LinkedListNode<T> Last { get; private set; }

public LinkedListNode<T> AddLast(T node)

{

var newNode = new LinkedListNode<T>(node);

if (First==null)

{

First = newNode;

newNode.Prev = Last;

Last = First;

}

else

{

LinkedListNode<T> previous = Last;

Last.Next = newNode;

Last = newNode;

Last.Prev = previous;

}

return newNode;

}

public IEnumerator<T> GetEnumerator()

{

LinkedListNode<T> current = First;

while (current!=null)

{

yield return current.Value;

current = current.Next;

}

}

IEnumerable IEnumerable.GetEnumerator()

{

return GetEnumerator();

}

}

LinkedList<T>包含LinkedListNode<T>元素.LinkedList中的类型T定义了类型T的属性first和last.AddLast方法现在接受类型T的参数,并实例化LinkedListNode<T>类型的对象.

除了IEnumerable接口,还有一个泛型版本IEnumerable<T>.IEnumerable<T>派生自IEnumerable,添加了返回IEnumerator<T>的GetEnumerable()方法,LinkedList<T>实现泛型接口IEnumerable<T>.

在Main函数中实现LinkedList<T>:

var list2 = new LinkedList<int>();

list2.AddLast(2);

list2.AddLast(3);

list2.AddLast(4);

//list2.AddLast("5");

foreach (var item in list2)

{

Console.WriteLine(item);

}

Console.ReadKey();

使用泛型类LinkedList<T>,可以用int类型实例化它,且无需装箱操作.如果不使用AddLast()方法传递int,就是出现一个错误,.使用IEnumerable<T>,foreach语句也是类型安全的,如果foreach语句中的变量不是int,就会出现编译错误,而不是运行异常.

C#编程(二十七)----------创建泛型类的更多相关文章

  1. Python进阶之面向对象编程(二)

    Python面向对象编程(二) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...

  2. WCF技术剖析之二十七: 如何将一个服务发布成WSDL[编程篇]

    原文:WCF技术剖析之二十七: 如何将一个服务发布成WSDL[编程篇] 对于WCF服务端元数据架构体系来说,通过MetadataExporter将服务的终结点导出成MetadataSet(参考< ...

  3. python接口自动化测试二十七:密码MD5加密 ''' MD5加密 ''' # 由于MD5模块在python3中被移除 # 在python3中使用hashlib模块进行md5操作 import hashlib # 待加密信息 str = 'asdas89799,.//plrmf' # 创建md5对象 hl = hashlib.md5() # Tips # 此处必须声明encode # 若写法为

    python接口自动化测试二十七:密码MD5加密   ''' MD5加密 '''# 由于MD5模块在python3中被移除# 在python3中使用hashlib模块进行md5操作import has ...

  4. 转:二十七、Java图形化界面设计——容器(JFrame)

    转:http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计——容器(JFrame) 程序是为了方便用户使用的, ...

  5. 二十七、Java图形化界面设计——容器(JFrame)

    摘自http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计--容器(JFrame) 程序是为了方便用户使用的, ...

  6. WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于WS-MEX的实现](提供模拟程序)

    原文:WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于WS-MEX的实现](提供模拟程序) 通过<如何将一个服务发布成WSDL[编程篇]>的介绍我们知道了如何可以通过编程或者配 ...

  7. Linux shell脚本编程(二)

    Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...

  8. Bootstrap<基础二十七> 多媒体对象(Media Object)

    Bootstrap 中的多媒体对象(Media Object).这些抽象的对象样式用于创建各种类型的组件(比如:博客评论),我们可以在组件中使用图文混排,图像可以左对齐或者右对齐.媒体对象可以用更少的 ...

  9. 【原创】高性能网络编程(二):上一个10年,著名的C10K并发连接问题

    1.前言 对于高性能即时通讯技术(或者说互联网编程)比较关注的开发者,对C10K问题(即单机1万个并发连接问题)应该都有所了解."C10K"概念最早由Dan Kegel发布于其个人 ...

随机推荐

  1. 绘图: matplotlib核心剖析

    参考:http://www.cnblogs.com/vamei/archive/2013/01/30/2879700.html http://blog.csdn.net/ywjun0919/artic ...

  2. vscodes使用(一): 常用插件,在线与离线安装

    一.常用插件 1.Live server 浏览器实时刷新 插件安装成功后,会在底部工具栏中,显示个Go Live *.html文件,点击右键,可以看到live server两条指令   2.Esasy ...

  3. KDevelop调试NS2

    1.将NS2项目导入到KDevelop 具体操作步骤:打开Kdevelop,首先,选择"Project"->"Open/Import Project".然 ...

  4. Webpack vs Gulp

    Webpack vs Gulp 谁会被拍死在沙滩上   本文组织结构 理想的前端开发流程 Gulp 为何物 Webpack 又是从哪冒出来的 结论 文章有点长,总共 1800 字,阅读需要 18 分钟 ...

  5. docker容器重启故障

    问题 强杀docker进程后,重启docker.docker中的容器无法启动并报错,报错内容如下 docker restart ae1f7b2c2f15 Error response from dae ...

  6. Mysql 查看用户

    一.查看用户和允许用户登录的地址权限. use mysql select host,user from user; 二.查看用户和所有用户权限 select * from user \G

  7. ubuntu ifconfig只有lo没有ens33的问题

    如果ifconfig只显示了lo, ifconfig -a 却正常显示ens33.那么可以按照如下的操作: service network-manager stop rm /var/lib/Netwo ...

  8. Netty---相关

    http://www.infoq.com/cn/articles/netty-million-level-push-service-design-points/ ChannelOption用到的soc ...

  9. error 1044 (42000):access denied for user ''@'localhost' to database 'quickapp' 解决方法

    在虚拟机上重新创建一个数据库时,一直出现这个报错:error 1044 (42000):access denied for user ''@'localhost' to database 'quick ...

  10. C#泛型的抗变与协变

    C#泛型的抗变与协变 学习自 C#本质论6.0 https://www.cnblogs.com/pugang/archive/2011/11/09/2242380.html Overview 一直以来 ...