泛型小试

  1. 泛型的优点:

      泛型最大的优点是性能,相比原来的非泛型集合类,少了很多的装箱拆卸的步骤。

     其次就是安全性。在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     }
View Code

 

 

     然后创建链表,这里继承了 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             }
View Code

 

 

因为实现了 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     }
View Code

 

 

 

posted @ 2017-11-30 17:41  刚出炉的程序猿  阅读(135)  评论(0)    收藏  举报