• 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类型的firstlast属性,他们分别标记了链表的头尾.AddLast()方法在链表层添加一个新元素.首先创建一个LinkedListNode类型的对象.如果连彪是空的,firstlast属性就设置为改新元素;否则,就把新元素添加为链表中的最后一个元素.该类还实现了一个接口了,后面介绍.

    接下来我们在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类型的对象.也可以返回和设置泛型类型,所以属性Nextprev的类型是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的属性firstlast.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,就会出现编译错误,而不是运行异常.

  • 相关阅读:
    Navsion二次开发_学习笔记
    《软件开发者路线图:从学徒到高手》笔记
    Concurrency并发性
    Excel VBA 函数
    在excel worksheet中添加button 和对Excel workbook做权限控制相关的新知识
    outline (group) 在Excel worksheet 中
    自主学习进度(软件工程)
    四则运算实现2(JAVA)
    简单四则运算实现(JAVA)
    数学建模(Lingo)(非线性整数规划)
  • 原文地址:https://www.cnblogs.com/FinleyJiang/p/7602512.html
Copyright © 2020-2023  润新知