下面这个例子创建的是链表的泛型版本。泛型类的定义与一般类类似,只是要使用泛型类型声明。之后,泛型类型就可以在类中用作一个字段成员,或者方法的参数类型。可以返回和设置泛型类型,所以属性Prev和Next的类型是LinkedListNode<T>.
除了IEnumerable接口,还有一个泛型版本IEnumerable<T>.IEnumerable<T>派生自IEnumerable,添加了返回IEnumeraotr<T>的GetEnumerator()方法,LinkedList<T>实现泛型接口IEnumerable<T>.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ProCSharp;
namespace ProCSharp
{
public class LinkedListNode<T>
{
public LinkedListNode(T value)
{
this.Value = value;
}
//包含一个属性Value,该属性用构造函数初始化
public T Value{get;private set;}
//LinkedListNode类包含对链表中下一个元素和上一个元素的引用,
//这些元素都可以从属性中访问
public LinkedListNode<T> Next { get; internal set; }
public LinkedListNode<T> Prev { get; internal set; }
}
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;
Last = newNode;
}
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;
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public class MainEntry
{
public static void Main()
{
var list = new LinkedList<int>();
list.AddLast(2);
list.AddLast(5);
list.AddLast(8);
list.AddLast(100);
foreach(int i in list)
{
Console.WriteLine(i);
}
var list2 = new LinkedList<string>();
list2.AddLast("Tsinghua University");
list2.AddLast("Peking University");
list2.AddLast("Zhejiang University");
foreach(string s in list2)
{
Console.WriteLine(s);
}
Console.ReadLine();
}
}
}