C# 集合类型(基础部分)

C#的集合相信的大家用的最多的类型之一,但是我之前除了几个常用的,对与其他的集合类型都不太了解,所以特意写一篇帖子,梳理自己的知识。

一、基本概念

数组:数组是相同数据类型的元素按一定顺序排列的集合
优点:在内存中连续存储,便于元素的便利
缺点:但正是这样的结构,使其插入数据非常麻烦,而且数组声明时必须执行长度,容易造成空间浪费

集合:针对数组的这些缺点,C#中最先提供了ArrayList对象来克服这些缺点
ArrayList:
优点:可根据添加的元素,动态执行大小,对元素的一些基本操作,比如,插入,移除都有定义,使用比较方便,
缺点:但是存放类型为object,很可能会报类型不匹配的错误,也就是ArrayList不是类型安全的,而且每次使用元素都要经历装箱拆箱操作,很损耗性能
所以,出现了泛型集合List< T>

二、实现集合功能的基本接口

System.Collections
这个命名空间包含接口和类定义各种对象,如列表、 队列、 位数组、 哈希表和字典集合,这个命名空间内的类型都是非泛型
System.Collections.Generic
这个命名空间包含定义泛型集合的接口和类,用户可以使用泛型集合来创建强类型集合,这种集合能提供比非泛型强类型集合更好的类型安全性和性能

FCL中提供了几个接口,只列举基本的接口,泛型就不写了

1)IEnumerable

公开枚举数,该枚举数支持在指定类型的集合上进行简单迭代
IEnumerable中只有一个方法,就是获取迭代器

    public interface IEnumerable
    {
        IEnumerator GetEnumerator();
    }

2)IEnumerator

支持在泛型集合上进行简单迭代,让我们能够依次访问集合的每一个元素
IEnumerator是最基本的迭代器接口

    public interface IEnumerator
    {
        object Current { get; }
        bool MoveNext();
        void Reset();
    }

实际就是IEnumerable提供最基础的提供迭代器的方法,ICollection在它的基础上封装了对集合操作的的基础方法,其他的集合接口都是基于这两个类的基础上进行再封装,添加更多的功能

下面,这段代码,是我自己写的一个结合类,继承自IEnumerable,模拟List的功能

    public class CustonList<T> : IEnumerable
    {
        public T[] array;
        private int length;
        private int index;

        public CustonList()
        {
            length = 8;
            index = -1;
            array = new T[length];
        }

        public void Add(T item)
        {
            index++;

            if (index >= array.Length)
            {
                EnlargeArray();
            }

            array[index] = item;
        }

        public void Remove(T item)
        {
            if (array.Length > 0)
            {
                T[] newArray = new T[array.Length];
                int newIndex = 0;
                foreach (T temp in array)
                {
                    if(!temp.Equals(item))
                    {
                        newArray[newIndex] = temp;
                        newIndex++;
                    }
                }

                array = newArray;
            }
        }
        //数组扩容,每次增加length定义的大小
        private void EnlargeArray()
        {

            T[] newArray = new T[array.Length + length];
            Array.Copy(array, newArray, array.Length);
            array = newArray;
        }
        public IEnumerator GetEnumerator()
        {
            foreach (T item in array)
            {
                if (item == null)
                {
                    break;
                }
                yield return item;
            }
        }
    }

3)ICollection

定义所有非泛型集合的大小、枚举数和同步方法。

    public interface ICollection : IEnumerable
    {
        int Count { get; }

        bool IsSynchronized { get; }

        object SyncRoot { get; }

        void CopyTo(Array array, int index);
    }

4)IList

表示可按照索引单独访问的对象的集合,提供了操作集合的一些基础方法

    public interface IList : ICollection, IEnumerable
    {
        object this[int index] { get; set; }
        bool IsReadOnly { get; }
        int Add(object value);
        void Clear();
        bool Contains(object value);
        int IndexOf(object value);
        void Insert(int index, object value);
        void Remove(object value);
        void RemoveAt(int index);
    }

5)IComparer

定义类型为比较两个对象而实现的方法

6)IEqualityComparer

定义用于支持比较对象是否相等的方法

7)ISet< T>

提供用于集的抽象的基接口,只有泛型接口

猜你喜欢

转载自blog.csdn.net/zcaixzy5211314/article/details/80782255