首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

一个泛型的例题代码,看了有几点疑问,求解答,该怎么处理

2013-11-25 
一个泛型的例题代码,看了有几点疑问,求解答这个就是定义一个泛型类LinkedList,做一个针对(整型数据和Stude

一个泛型的例题代码,看了有几点疑问,求解答
这个就是定义一个泛型类LinkedList,做一个针对(整型数据和Student类型数据)的链表
Student类型已在开头定义好 ,Node就是针对链表中的节点进行一些操作,LinkedList就是调用Node中的一些方法再加上自己的方法实现链表的功能,一下是代码。
我的问题代码在后面提出。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace GenericSamp
{
    public class Student
    {
        private string StudentName;
        private int StudentAge;
        public Student(string name, int age)
        {
            this.StudentName = name;
            this.StudentAge = age;
        }
        public override string ToString()
        {
            return this.StudentName + ":年龄" + this.StudentAge + "岁";
        }
    }
    public class Node<T>
    {
        T data;
        Node<T> next;
        public Node(T data)
    {
        this.data=data;
        this.next=null;
    }
    public T Data{
    get {return this.data;}
    set{data=value;}
}
    public Node<T> Next{
    get{return this.next;}
    set{this.next=value;}
 
}
    public void Append(Node<T> newNode){
    if(this.next==null){this.next=newNode;}
    else{next.Append(newNode);}
}
    public override string ToString(){
    string output=data.ToString();
    if(next!=null){output+=","+next.ToString();}
    return output;
}
    }
    public class LinkedList<T>
    {
        Node<T> headNode = null;
        public void Add(T data)
        {
            if (headNode == null)
            {
                headNode = new Node<T>(data);
            }
            else
            {
                headNode.Append(new Node<T>(data));
            }
        }
        public T this[int index]
        {
            get
            {
                int temp = 0;
                Node<T> node = headNode;
                while (node != null && temp <= index)
                {
                    if (temp == index)
                    {
                        return node.Data;
                    }
                    else
                    {
                        node = node.Next;
                    }


                    temp++;
                }
                return default(T);
 
            }
 
        }
        public override string ToString()
        {
            if (this.headNode != null)
            {
                return this.headNode.ToString;
            }
            else
            {
                return string.Empty;
            }
        }
 
    }
    class Program
    {
        static void Main(string[] args)
        {
            LinkedList<int> intList=new LinkedList<int>();
            for (int i = 0; i < 5; i++)
            {
                intList.Add(i);
            }
            Console.WriteLine("整型List的内容为:" + intList);
            LinkedList<Student> StudentList = new LinkedList<Student>();
            StudentList.Add(new Student("张三",20));
            StudentList.Add(new Student("李四",22));
            StudentList.Add(new Student("王五",21));
            Console.WriteLine("Student类型List的内容为:" + StudentList);
        }
    }
}



第一个问题:在LinkedList泛型那段中的一个方法public T this[int index],这段代码如何实现的对LinkedList数组中的每一个元素赋值,求详细分析过程。
第二个问题:在Node类和LinkedList类定义的时候,最后都重载了一个Tostring方法,有什么作用,想用这个来干什么,去掉了又什么影响,为什么。

问题可能不好回答,还是求大神帮忙了
[解决办法]
第一个问题:在LinkedList泛型那段中的一个方法public T this[int index],这段代码如何实现的对LinkedList数组中的每一个元素赋值,求详细分析过程。
没实现你说的功能,它只是循环查找,直到指定的下标,并且返回/设置这个元素。具体google 索引器。

 第二个问题:在Node类和LinkedList类定义的时候,最后都重载了一个Tostring方法,有什么作用,想用这个来干什么,去掉了又什么影响,为什么。
因为调试器的显示以及Console.WriteLine默认会用到它,去掉,输出的是类名。你试下就知道了。
[解决办法]
1、
get
    {
        int temp = 0;//定义一个临时变量用于标志当前的索引
        Node<T> node = headNode;//Node节点
        while (node != null && temp <= index)//while循环,当节点不为null并且小于等于index时,即temp不大于index时,循环执行
        {
           if (temp == index)//传入的索引就等于当前索引时,返回当前对象的Data
           {
                return node.Data;
           }
           else//当temp小于传入的index时,指针指向下一个
           {
                node = node.Next;
           }
           temp++;//变量++
       }
     return default(T);
}
2、注意一下叫方法的重写,不叫重载。重写ToString方法是为了能够不使用默认的ToString方法,而能够在调用ToString方法的时候自定义显示自己想要的格式。
[解决办法]
Console.WriteLine("整型List的内容为:" + intList);这句执行时,会默认的调用intList.ToString()方法,进而执行return this.headNode.ToString();返回这个列表的字符串形式。而在你循环 intList.Add(i);的时候,会调用Add方法。headNode.Append(new Node<T>(data));//这句话就是关键,将一个一个单独的节点连接起来。

热点排行