C#编程(二十七)----------创建泛型类
创建泛型类
首先介绍一个一般的,非泛型的简化链表类,可以包含任意类型的对象,以后再把这个类转化为泛型类.
在立案表中,一个元素引用下一个元素.所以必须创建一个类,他将对象封装在链表中,并引用下一个对象.类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#编程(二十七)----------创建泛型类的更多相关文章
- Python进阶之面向对象编程(二)
Python面向对象编程(二) .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB& ...
- WCF技术剖析之二十七: 如何将一个服务发布成WSDL[编程篇]
原文:WCF技术剖析之二十七: 如何将一个服务发布成WSDL[编程篇] 对于WCF服务端元数据架构体系来说,通过MetadataExporter将服务的终结点导出成MetadataSet(参考< ...
- 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 ...
- 转:二十七、Java图形化界面设计——容器(JFrame)
转:http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计——容器(JFrame) 程序是为了方便用户使用的, ...
- 二十七、Java图形化界面设计——容器(JFrame)
摘自http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计--容器(JFrame) 程序是为了方便用户使用的, ...
- WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于WS-MEX的实现](提供模拟程序)
原文:WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于WS-MEX的实现](提供模拟程序) 通过<如何将一个服务发布成WSDL[编程篇]>的介绍我们知道了如何可以通过编程或者配 ...
- Linux shell脚本编程(二)
Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...
- Bootstrap<基础二十七> 多媒体对象(Media Object)
Bootstrap 中的多媒体对象(Media Object).这些抽象的对象样式用于创建各种类型的组件(比如:博客评论),我们可以在组件中使用图文混排,图像可以左对齐或者右对齐.媒体对象可以用更少的 ...
- 【原创】高性能网络编程(二):上一个10年,著名的C10K并发连接问题
1.前言 对于高性能即时通讯技术(或者说互联网编程)比较关注的开发者,对C10K问题(即单机1万个并发连接问题)应该都有所了解."C10K"概念最早由Dan Kegel发布于其个人 ...
随机推荐
- jexus - 分析日志文件
1.统计IP访问次数 awk '{print $3}' default |sort -n|uniq -c|sort -rn|head
- TcxGrid 标题头高度
- 无效GRANT语句导致主从同步断开
最近遇到一个主从同步断开的案例,是由于在执行GRANT语句时,授权对象给错了,也就可以理解为无效的GRANT语句,我们收到slave库同步断开的报警信息,然后去找问题,发现binlog有报错,报错提示 ...
- 数学之美——HMM模型(一)介绍
一直想写点关于数学方面的blog,这对于数据挖掘分析,NLP处理等都有着比较重要的作用,之前在CSDN上想写点HMM方面的文章,一直没写成,最近几天终于抽点时间完成了HMM的文章,加以整理,遂有这个系 ...
- 【洛谷】P4198 楼房重建
题解 我们转而维护每个点的斜率,显然一个楼房能被看见它就是一个前缀最大值,斜率比较为了节约精度可以用向量替代 我们每个区间维护被看到的楼房的个数,和楼房的最大值,叶子节点在有楼房时,值为1 那么考虑合 ...
- Educational Codeforces Round 41 (Rated for Div. 2)
这场没打又亏疯了!!! A - Tetris : 类似俄罗斯方块,模拟一下就好啦. #include<bits/stdc++.h> #define fi first #define se ...
- spark优化之临时目录
官方是这样说的: Directory to use for "scratch" space in Spark, including map output files and RDD ...
- SQL中的坑
一.where,group by,having --group by 和having 解释:前提必须了解sql语言中一种特殊的函数:聚合函数, 例如SUM, COUNT, MAX, AVG等.这些函数 ...
- MIT-6.828-JOS-lab6:Network Driver
MIT-6.828 Lab 6: Network Driver (default final project) tags: mit-6.828 os 概述 本lab是6.828默认的最后一个实验,围绕 ...
- 【Ray Tracing in One Weekend 超详解】 光线追踪1-4
我们上一篇写了Chapter5 的第一个部分表面法线,那么我们来学剩下的部分,以及Chapter6. Chapter5:Surface normals and multiple objects. 我们 ...