• C#中IEnumerable、ICollection、IList、List之间的区别


    IEnumerable、ICollection、IList、List之间的区别,本文分别分析了它的实现源码,从而总结出了它们之间的关系和不同之处。

    首先我看看 IEnumerable:

        //  摘要:
        //  公开枚举器,该枚举器支持在指定类型的集合上进行简单迭代。
        //
        //  类型参数:
        //  T:
        //  要枚举的对象的类型。
        [TypeDependency("System.SZArrayHelper")]
        public interface IEnumerable<out T> : IEnumerable
        {
            // 摘要:
            //   返回一个循环访问集合的枚举器。
            //
            // 返回结果:
            //   可用于循环访问集合的 System.Collections.Generic.IEnumerator<T>。
            IEnumerator<T> GetEnumerator();
        }
    

     IEnumerable<T> 实现IEnumerable接口方法,那IEnumberable做什么的,其实就提高可以循环访问的集合。说白了就是一个迭代。

    再来看看ICollection:

     // 摘要:
     // 定义操作泛型集合的方法。
     //
     // 类型参数:
     // T:
     // 集合中元素的类型。
     [TypeDependency("System.SZArrayHelper")]
     public interface ICollection<T> : IEnumerable<T>, IEnumerable
    

    原来ICollection<T> 同时继承IEnumerable<T>和IEnumerable两个接口,按我的理解就是,ICollection继续它们2个接口而且扩展了方法,功能强多了。

    我们继续看IList:

    public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable
    

     IList 继承它们三个接口,怪不得功能这么多啊

    最后来看看List:

    public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable
    

    它们都是接口,只有List 是类,不仅实现它们的接口,而且还扩展了太多的方法给我利用,几乎所有功能都能实现了。

    按照功能排序:List<T> 《IList<T> 《ICollection<T>《IEnumerable<T>

    按照性能排序:IEnumerable<T>《ICollection<T>《IList<T>《List<T>

    另一种解释:

         ICollection 接口是 System.Collections 命名空间中类的基接口,ICollection 接口扩展 IEnumerable,IDictionary 和 IList 则是扩展 ICollection 的更为专用的接口。如果 IDictionary 接口和 IList 接口都不能满足所需集合的要求,则从 ICollection 接口派生新集合类以提高灵活性。

    ICollection是IEnumerable的加强型接口,它继承自IEnumerable接口,提供了同步处理、赋值及返回内含元素数目的功能

    一、ICollection接口的原型

     namespace System.Collections
        {
            // 摘要:
            //     定义所有非泛型集合的大小、枚举器和同步方法。
            [ComVisible(true)]
            public interface ICollection : IEnumerable
            {
                // 摘要:
                //     获取 System.Collections.ICollection 中包含的元素数。
                //
                // 返回结果:
                //     System.Collections.ICollection 中包含的元素数。
                int Count { get; }
                //
                // 摘要:
                //     获取一个值,该值指示是否同步对 System.Collections.ICollection 的访问(线程安全)。
                //
                // 返回结果:
                //     如果对 System.Collections.ICollection 的访问是同步的(线程安全),则为 true;否则为 false。
                bool IsSynchronized { get; }
                //
                // 摘要:
                //     获取一个可用于同步对 System.Collections.ICollection 的访问的对象。
                //
                // 返回结果:
                //     可用于同步对 System.Collections.ICollection 的访问的对象。
                object SyncRoot { get; }
    
                // 摘要:
                //     从特定的 System.Array 索引处开始,将 System.Collections.ICollection 的元素复制到一个 System.Array
                //     中。
                //
                // 参数:
                //   array:
                //     作为从 System.Collections.ICollection 复制的元素的目标位置的一维 System.Array。System.Array
                //     必须具有从零开始的索引。
                //
                //   index:
                //     array 中从零开始的索引,将在此处开始复制。
                //
                // 异常:
                //   System.ArgumentNullException:
                //     array 为 null。
                //
                //   System.ArgumentOutOfRangeException:
                //     index 小于零。
                //
                //   System.ArgumentException:
                //     array 是多维的。- 或 -源 System.Collections.ICollection 中的元素数目大于从 index 到目标 array
                //     末尾之间的可用空间。
                //
                //   System.ArgumentException:
                //     源 System.Collections.ICollection 的类型无法自动转换为目标 array 的类型。
                void CopyTo(Array array, int index);
            }
        }
    

    二、IEnumerable接口

    1、IEnumerable接口是ICollection的父接口,凡实现此接口的类,都具备“可迭代”的能力。

    2、IEnumerable接口只定义了一个方法:GetEnumerator,该方法将返回一个“迭代子”对象(或称为迭代器对象),是一个实现了IEnumerator接口的对象实例。

    3、凡是实现了IEnumerable接口的类,都可以使用foreach循环迭代遍历。

    三、简单的ICollection实现范例

    public class MyCollectioin:ICollection
    {
       private string[] list;
       private object root;
        
       public MyCollection()
       {
           list = new string[3]{"1","3","4"};
       }
     
        #region ICollection Members
        public bool IsSynchronized
        {
            get{
               return true;
            }
        }
     
         public int Count
         {
             get
             {
                return list.Length;
             }
         }
     
         public void CopyTo(Array array,int index)
         {
             list.CopyTo(array,index);
         }
         
        public object SyncRoot
        {
            get
             {
                return root;
             }
        }
        #endregioin
         
        #region IEnumerable Members
         public IEnumerable GetEnumerator()
         {
            return list.GetEnumerator();
         }
     
        #endregion
    }
    

    四、ICollection<T>

         ICollection<T>是可以统计集合中对象的标准接口。该接口可以确定集合的大小(Count),集合是否包含某个元素(Contains),复制集合到另外一个数组(ToArray),集合是否是只读的(IsReadOnly)。如果一个集合是可编辑的,那么可以调用Add,Remove和Clear方法操作集合中的元素。因为该接口继承IEnumerable<T>,所以可以使用foreach语句遍历集合。

    ICollection<T>定义源码

    public interface ICollection<T> : IEnumerable<T>
    {
        // Number of items in the collections.       
        int Count { get; }
     
        bool IsReadOnly { get; }
     
        void Add(T item);
     
        void Clear();
     
        bool Contains(T item);
                 
        // CopyTo copies a collection into an Array, starting at a particular
        // index into the array.
        //
        void CopyTo(T[] array, int arrayIndex);
                 
        //void CopyTo(int sourceIndex, T[] destinationArray, int destinationIndex, int count);
     
        bool Remove(T item);
    }
    

      

      

      

      

      

      

      

  • 相关阅读:
    hdu 4027 Can you answer these queries?
    hdu 4041 Eliminate Witches!
    hdu 4036 Rolling Hongshu
    pku 2828 Buy Tickets
    hdu 4016 Magic Bitwise And Operation
    pku2886 Who Gets the Most Candies?(线段树+反素数打表)
    hdu 4039 The Social Network
    hdu 4023 Game
    苹果官方指南:Cocoa框架(2)(非原创)
    cocos2d 中 CCNode and CCAction
  • 原文地址:https://www.cnblogs.com/lgx5/p/10659601.html
Copyright © 2020-2023  润新知