C#基礎知識整理 基礎知識(17)ILiest介面——泛型

來源:互聯網
上載者:User
對於ArrayList中如果插入實值型別會引發裝箱操作,而取出實值型別又需要拆箱,如下

            ArrayList myArrayList = new ArrayList();            myArrayList.Add(40);//裝箱            myArrayList.Add(80);//裝箱                        Int32 a1 = (Int32)myArrayList[0];//拆箱            Int32 a2 = (Int32)myArrayList[1];//拆箱

從而造成效能的消耗。至於裝箱的詳細解說見下一篇。
為瞭解決這些問題,C#中有支援泛型的IList<T>介面,下面看詳細代碼,其實結構都和IList一樣,只是增加了泛型。

 /// <summary>    /// 泛型集合類    /// </summary>    /// <typeparam name="T"></typeparam>    public class List<T> : IList<T>, IList    {        /// <summary>        /// 泛型迭代器        /// </summary>        /// <typeparam name="T"></typeparam>        public struct Enumertor<T> : IEnumerator, IEnumerator<T>        {            //迭代索引            private int index;            //迭代器所屬的集合對象引用            private List<T> list;            public Enumertor(List<T> container)            {                this.list = container;                this.index = -1;            }            public void Dispose()            {            }           /// <summary>           /// 顯示實現IEnumerator的Current屬性           /// </summary>            object IEnumerator.Current            {                get                {                    return list[index];                }            }            /// <summary>            /// 實現IEnumerator<T>的Current屬性            /// </summary>            public T Current            {                get                {                    return list[index];                }            }            /// <summary>            /// 迭代器指示到下一個資料位元置            /// </summary>            /// <returns></returns>            public bool MoveNext()            {                if (this.index < list.Count)                {                    ++this.index;                }                return this.index < list.Count;            }            public void Reset()            {                this.index = -1;            }        }        /// <summary>        /// 儲存資料的數組,T類型則體現了泛型的作用。        /// </summary>        private T[] array;        /// <summary>        /// 當前集合的長度        /// </summary>        private int count;        /// <summary>        /// 預設建構函式        /// </summary>        public List()            : this(1)        {        }        public List(int capacity)        {            if (capacity < 0)            {                throw new Exception("集合初始長度不能小於0");            }            if (capacity == 0)            {                capacity = 1;            }            this.array = new T[capacity];        }        /// <summary>        /// 集合長度        /// </summary>        public int Count        {            get            {                return this.count;            }        }        /// <summary>        /// 集合實際長度        /// </summary>        public int Capacity        {            get            {                return this.array.Length;            }        }        /// <summary>        /// 是否固定大小        /// </summary>        public bool IsFixedSize        {            get            {                return false;            }        }        /// <summary>        /// 是否唯讀        /// </summary>        public bool IsReadOnly        {            get            {                return false;            }        }        /// <summary>        /// 是否可同屬性        /// </summary>        public bool IsSynchronized        {            get            {                return false;            }        }        /// <summary>        /// 同步對象        /// </summary>        public object SyncRoot        {            get            {                return null;            }        }        /// <summary>        /// 長度不夠時,重新分配長度足夠的數組        /// </summary>        /// <returns></returns>        private T[] GetNewArray()        {            return new T[(this.array.Length + 1) * 2];        }        /// <summary>        /// 實現IList<T>Add方法        /// </summary>        /// <param name="value"></param>        public void Add(T value)        {            int newCount = this.count + 1;            if (this.array.Length < newCount)            {                T[] newArray = GetNewArray();                Array.Copy(this.array, newArray, this.count);                this.array = newArray;            }            this.array[this.count] = value;            this.count = newCount;        }        /// <summary>        /// 向集合末尾添加對象        /// </summary>        /// <param name="value"></param>        /// <returns></returns>         int IList.Add(object value)        {            ((IList<T>)this).Add((T)value);            return this.count - 1;        }        /// <summary>        /// 實現IList<T>索引器        /// </summary>        /// <param name="index"></param>        /// <returns></returns>        public T this[int index]        {            get            {                if (index < 0 || index >= this.count)                {                    throw new ArgumentOutOfRangeException("index");                }                return this.array[index];            }            set            {                if (index < 0 || index >= this.count)                {                    throw new ArgumentOutOfRangeException("index");                }                this.array[index] = value;            }        }        /// <summary>        /// 顯示實現IList介面的索引器        /// </summary>        /// <param name="index"></param>        /// <returns></returns>        object IList.this[int index]        {            get            {                return ((IList<T>)this)[index];            }            set            {                ((IList<T>)this)[index] = (T)value;            }        }        /// <summary>        /// 刪除集合中的元素        /// </summary>        /// <param name="index"></param>        /// <param name="count"></param>        public void RemoveRange(int index, int count)        {            if (index < 0)            {                throw new ArgumentOutOfRangeException("index");            }            int removeIndex = index + count;            if (count < 0 || removeIndex > this.count)            {                throw new ArgumentOutOfRangeException("index");            }            Array.Copy(this.array, index + 1, this.array, index + count - 1, this.count - removeIndex);            this.count -= count;        }        /// <summary>        /// 實現IList<T>介面的indexOf方法        /// </summary>        /// <param name="value"></param>        /// <returns></returns>        public int IndexOf(T value)        {            int index = 0;            if (value == null)            {                while (index < this.count)                {                    if (this.array[index] == null)                    {                        return index;                    }                    ++index;                }            }            else            {                while (index < this.count)                {                    if (value.Equals(this.array[index]))                    {                        return index;                    }                    ++index;                }            }            return -1;        }        /// <summary>        /// 顯示實現IList介面的IndexOf方法        /// </summary>        /// <param name="value"></param>        /// <returns></returns>         int IList.IndexOf(object value)        {            return ((IList<T>)this).IndexOf((T)value);        }        /// <summary>        /// 尋找對應數組項        /// </summary>        /// <param name="o"></param>        /// <param name="compar"></param>        /// <returns></returns>        public int IndexOf(object o, IComparer compar)        {            int index = 0;            while (index < this.count)            {                if (compar.Compare(this.array[index], o) == 0)                {                    return index;                }                ++index;            }            return -1;        }        /// <summary>        /// 實現IList<T>介面的Remove方法        /// </summary>        /// <param name="value"></param>        /// <returns></returns>        public bool Remove(T value)        {            int index = this.IndexOf(value);            if (index >= 0)            {                this.RemoveRange(index, 1);                return true;            }            return false;        }        /// <summary>        /// 顯示實現IList介面的Remove方法,此處顯示實現        /// </summary>        /// <param name="value"></param>        void IList.Remove(object value)        {            ((IList<T>)this).Remove((T)value);        }        /// <summary>        /// 從集合指定位置刪除對象的引用        /// </summary>        /// <param name="index"></param>        public void RemoveAt(int index)        {            RemoveRange(index, 1);        }        /// <summary>        /// 彈出集合的最後一個元素        /// </summary>        /// <returns></returns>        public object PopBack()        {            object o = this.array[this.count - 1];            RemoveAt(this.count - 1);            return o;        }        /// <summary>        /// 彈出集合第一個對象        /// </summary>        /// <returns></returns>        public object PopFront()        {            object o = this.array[0];            RemoveAt(0);            return o;        }        /// <summary>        /// 實現IList<T>介面的Insert方法        /// </summary>        /// <param name="index"></param>        /// <param name="value"></param>        public void Insert(int index, T value)        {            if (index >= this.count)            {                throw new ArgumentOutOfRangeException("index");            }            int newCount = this.count + 1;            if (this.array.Length < newCount)            {                T[] newArray = GetNewArray();                Array.Copy(this.array, newArray, index);                newArray[index] = value;                Array.Copy(this.array, index, newArray, index + 1, this.count - index);                this.array = newArray;            }            else            {                Array.Copy(this.array, index, this.array, index + 1, this.count - index);                this.array[index] = value;            }            this.count = newCount;        }        /// <summary>        /// 顯示實現IList介面的Insert方法        /// </summary>        /// <param name="index"></param>        /// <param name="value"></param>        void IList.Insert(int index, object value)        {            ((IList<T>)this).Insert(index, (T)value);        }        /// <summary>        /// 實現IList<T>介面的Contains方法        /// </summary>        /// <param name="value"></param>        /// <returns></returns>        public bool Contains(T value)        {            return this.IndexOf(value) >= 0;        }        /// <summary>        /// 顯示實現IList<T>介面的Contains方法        /// </summary>        /// <param name="value"></param>        /// <returns></returns>        bool IList.Contains(object value)        {            return ((IList<T>)this).IndexOf((T)value) >= 0;        }        /// <summary>        /// 將集合壓縮為實際長度        /// </summary>        public void TrimToSize()        {            if (this.array.Length > this.count)            {                T[] newArray = null;                if (this.count > 0)                {                    newArray = new T[this.count];                    Array.Copy(this.array, newArray, this.count);                }                else                {                    newArray = new T[1];                }                this.array = newArray;            }        }        /// <summary>        /// 清空集合        /// </summary>        public void Clear()        {            this.count = 0;        }        /// <summary>        /// 實現IEnumerable介面的GetEnumerator方法        /// </summary>        /// <returns></returns>        public IEnumerator<T> GetEnumerator()        {            Enumertor<T> ator = new Enumertor<T>(this);            return ator;        }        /// <summary>        /// 顯示實現IEnumerable介面的GetEnumerator方法        /// </summary>        /// <returns></returns>        IEnumerator IEnumerable.GetEnumerator()        {            return ((IEnumerable<T>)this).GetEnumerator();        }        /// <summary>        /// 實現ICollection<T>介面的CopyTo方法        /// </summary>        /// <param name="array"></param>        /// <param name="index"></param>        public void CopyTo(T[] array, int index)        {            Array.Copy(this.array, 0, array, index, this.count);        }        /// <summary>        /// 顯示實現實現ICollection<T>介面的CopyTo方法        /// </summary>        /// <param name="array"></param>        /// <param name="index"></param>        void ICollection.CopyTo(Array array, int index)        {            Array.Copy(this.array, 0, array, index, this.count);        }    }

調用:

 static void Main(string[] args)        {            //由於已經指定了int,因此加入實值型別不會有裝箱拆箱操作。            List<int> tList = new List<int>();            tList.Add(25);            tList.Add(30);            foreach (int n in tList)            {                Console.WriteLine(n);            }            Console.ReadLine();        }

以上就是C#基礎知識整理 基礎知識(17)ILiest介面——泛型 的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.