c#中泛型集合類的一個簡單類比實現

來源:互聯網
上載者:User

      c#中的泛型集合類用起來十分的方便快捷。在這篇隨筆裡面,我將用鏈表來類比c#中的 List<T> 類的行為,廢話不多說,下面來看我的實現代碼,代碼中已經寫了注釋,所以不再對代碼進行額外的說明:

using System.Collections;

 class MyList<T>
    {
        private MyListNode firstNode;//首節點
        private int count;//節點計數
 
        public MyList()
        {
            this.firstNode = null;
            this.count = 0;
        }
        //得到List長度
        public int GetLength()
        {
            return this.count;
        }

        //增加一個節點
        public void AddElement(T data)
        {
            MyListNode first = this.firstNode;
            if(first==null)
            {
                this.firstNode=new MyListNode(data);
                this.count++;
                return;
            }
            while (first.next != null)
            {
                first = first.next;
            }
            first.next = new MyListNode(data);
            this.count++;
        }

        //刪除一個節點
        public bool Remove(T data)
        {
            MyListNode first = this.firstNode;
            if (first.data.Equals(data))
            {
                this.firstNode = first.next;
                this.count--;
                return true;
            }
            while (first.next!=null)
            {
                if (first.next.data.Equals(data))
                {
                    first.next = first.next.next;
                    this.count--;
                    return true;
                }
            }
            return false;
        }

        //得到指定索引上的集合元素
        public T GetAtIndex(int index)
        {
            int innercount = 1;
            MyListNode first = this.firstNode;
            if (index > count)
            {
                throw new Exception("Index out of boundary");
            }
            else
            {
                while (innercount < index)
                {
                    first = first.next;
                    innercount++;
                }
                return first.data;
            }
        }

        //在指定的索引上插入新的元素
        public void InsertAtIndex(int index,T data)
        {
            int innercount = 1;
            MyListNode first = this.firstNode;
            if (index > count)
            {
                throw new Exception("Index out of boundary");
            }
            if (index == 1)
            {
                this.firstNode = new MyListNode(data);
                this.firstNode.next = first;
            }
            else
            {
                while (innercount < index - 1)
                {
                    first = first.next;
                    innercount++;
                }
                MyListNode newNode = new MyListNode(data);
                newNode.next = first.next;
                first.next = newNode;
            }
            this.count++;
        }

        //刪除指定索引上的集合元素
        public void RemoveAtIndex(int index)
        {
            int innercount = 1;
            MyListNode first = this.firstNode;
            if (index > count)
            {
                throw new Exception("Index out of boundary");
            }
            if (index == 1)
            {
                this.firstNode = first.next;
            }
            else
            {
                while (innercount < index - 1)
                {
                    first = first.next;
                    innercount++;
                }
                first.next = first.next.next;
            }
            this.count--;
        }

        //刪除集合中的所有元素
        public void RemoveAll()
        {
            this.firstNode = null;
            this.count = 0;
        }

        //為實現該集合類能用foreach進行遍曆
        public IEnumerator GetEnumerator()
        {
            MyListNode first = this.firstNode;
            while (first!= null)
            {
                yield return first.data;
                first = first.next;
            }
        }

        //內部節點類
        private class MyListNode
        {
            public T data { get; set; }//節點上的元素值
            public MyListNode next { get; set; }//節點的下一個節點
            public MyListNode(T nodeData)
            {
                this.data = nodeData;
                this.next = null;
            }
        }
    }

         下面是對這個類比類的使用:

class Program
    {
        static void Main(string[] args)
        {
            MyList<string> ml = new MyList<string>();
            ml.AddElement("xu");
            ml.AddElement("jin");
            ml.AddElement("lin");
            ml.AddElement("love");
            ml.AddElement("jasmine");
            ml.InsertAtIndex(4, "fiercely");
            ml.RemoveAtIndex(2);
            ml.Remove("lin");
            foreach (string s in ml)
            {
                Console.WriteLine(s);
            }
        }
    }

     

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.