泛型小试
-
泛型的优点:
泛型最大的优点是性能,相比原来的非泛型集合类,少了很多的装箱拆卸的步骤。
其次就是安全性。在ArrayList中可以添加任意类型。如:
var list = new ArrayList();
list.Add(44);
list.Add("mystring");
list.Add(new MyClass());
当需要像下面使用foreach迭代器进行输出时就会出现运行异常;而使用泛型时就可以避免这些问题的出现。
foreach (string i in list)
{
Console.WriteLine(i);
}
简单的使用泛型
首先构建一个链表。先创建一个节点类,里面包括有节点的值,上一个节点,下一个节点以及节点编号。
1 public class LinkNode<T> 2 { 3 public LinkNode(T node, int index) 4 { 5 Value = node; 6 Index = index; 7 } 8 public T Value { get; private set; } 9 public LinkNode<T> Next { get; internal set; } 10 public LinkNode<T> Prev { get; internal set; } 11 public int Index { get; private set; } 12 }
然后创建链表,这里继承了 IEnumerable这个接口,为了能使用迭代器遍历链表
1 public class LinkNodeList<T> : IEnumerable<T> 2 { 3 public LinkNode<T> First { get; private set; } 4 public LinkNode<T> Last { get; private set; } 5 private int index = 1; 6 public LinkNode<T> AddNode(T node) 7 { 8 var newNode = new LinkNode<T>(node, index); 9 if (First == null) 10 { 11 First = newNode; 12 newNode.Prev = Last; 13 Last = First; 14 } 15 else 16 { 17 LinkNode<T> previous = Last; 18 Last.Next = newNode; 19 Last = newNode; 20 Last.Prev = previous; 21 } 22 index++; 23 return newNode; 24 } 25 26 public IEnumerator<T> GetEnumerator() 27 { 28 LinkNode<T> current = First; 29 while (current != null) 30 { 31 yield return current.Value; 32 current = current.Next; 33 } 34 } 35 36 IEnumerator IEnumerable.GetEnumerator() 37 { 38 return GetEnumerator(); 39 } 40 41 42 }
添加数据后输出:
1 LinkNodeList<string> list = new LinkNodeList<string>(); 2 list.AddNode("a"); 3 list.AddNode("b"); 4 list.AddNode("c"); 5 list.AddNode("d"); 6 foreach (string i in list) 7 { 8 Console.WriteLine(i); 9 }
因为实现了 IEnumerable这个接口,可以使用ToList转化为List格式的数据,这样就可以使用Linq进行各种数据的操作。
同时也可以给List添加一个拓展方法,实现List转回链表,代码如下:
1 public static class ExtendHolder 2 { 3 public static LinkNodeList<T> ToLinkedList<T>(this IList<T> list) 4 { 5 var linkNodeList = new LinkNodeList<T>(); 6 7 foreach (var item in list) 8 { 9 linkNodeList.AddNode(item); 10 } 11 return linkNodeList; 12 } 13 }

浙公网安备 33010602011771号