创建泛型类

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

在立案表中,一个元素引用下一个元素.所以必须创建一个类,他将对象封装在链表中,并引用下一个对象.类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. 巧用PHP数组函数

    2014年3月5日 08:48:39 情景:项目中需要根据传递来的参数的不同,使用不同的缓存 假如传递来的参数最多有这几个(在这个范围内,但是每次传过来的参数不确定): $arg = array( ' ...

  2. 使用管道和cronolog切割日志

    安装cronolog git clone https://github.com/fordmason/cronolog ./configure make && make install ...

  3. python基础-装饰器,生成器和迭代器

    学习内容 1.装饰器 2.生成器 3.迭代器 4.软件目录结构规范 一:装饰器(decorator) 1.装饰器定义:本质就是函数,用来装饰其他函数,即为其他函数添加附加功能. 2.装饰器原则:1)不 ...

  4. Android WebView 详解

    相关API 相关类介绍 WebResourceRequest 添加于API21,封装了一个Web资源的请求信息,包含:请求地址,请求方法,请求头,是否主框架,是否用户点击,是否重定向 WebResou ...

  5. 2011TG初赛

    一.单项选择题(共20题,每题1.5分,共计30分,每题有且仅有一个正确选项.) 1. 在二进制下,1011001+( )=1100110. A.1011 B.1101 C.1010 D.1111 B ...

  6. 动态规划(dp)专题

    航线设置   问题描述在美丽的莱茵河畔,每边都分布着N个城市,两边的城市都是唯一对应的友好城市,现需要在友好城市间开通航线以加强往来,但因为莱茵河常年大雾,如果开设的航线发生交叉就有可能出现碰船的现象 ...

  7. 织梦任意页面调用{dede:field.content/}的方法

    过滤掉所有的html代码,只显示文字,具体的ID自己更改. 代码如下: {dede:sql sql='Select content from dede_arctype where id=1'} [fi ...

  8. PHP 5.2、5.3、5.4、5.5、5.6 对比以及功能详解

    php5.2.x php5.3.x php5.4.x php5.5.x php5.6.x 对比详解 截至目前(2014.2), PHP 的最新稳定版本是 PHP5.5, 但有差不多一半的用户仍在使用已 ...

  9. 图学ES6-1.ECMAScript 6简介

  10. Spring中AOP实现

    1.什么是SpringAOP 什么是aop:Aspect Oriented Programming的缩写,面向切面编程,通过预编译和动态代理实现程序功能的 统一维护的一种技术 主要功能:日志记录,性能 ...