C#中ICollection介绍

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

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

一、ICollection接口的原型

C# 代码   复制

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实现范例

C# 代码   复制

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>定义源码

C# 代码   复制

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);
}
时间: 2024-10-26 05:53:06

C#中ICollection介绍的相关文章

[转]C# 互操作性入门系列(一):C#中互操作性介绍

传送门 C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列(二):使用平台调用调用Win32 函数 C# 互操作性入门系列(三):平台调用中的数据封送处理 C# 互操作性入门系列(四):在C#中调用COM组件 本专题概要: 引言 平台调用 C++ Interop(互操作) COM Interop(互操作) 一.引言   这个系列是在C#基础知识中遗留下来的一个系列的,因为在C# 4.0中的一个新特性就是对COM互操作改进,然而COM互操作性却是.NET

C#中的委托介绍

什么是委托? 之前写了事件的介绍: 这里也把委托相关知识也总结一下. 委托是c#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针 声明委托的方式:delegate 返回值类型 委托类型名(参数) 比如: 代码如下: delegate void StringProcess(string s); 注意:这里的除了前面的delegate,剩下部分和声明一个函数一样,但是StringProcess不是函数名,而是委托类型名 声明的委托是一种类型,就像int.Person一样,如果要用的话还要声

设计模式在实际业务应用中的介绍之1——抽象工厂模式实现对数据库访问组件的封装

设计模式在实际业务应用中的介绍之1--抽象工厂模式实现对数据库访问组件的封装 基于C#打造的通用数据库访问组件 基于C#打造的通用数据库访问组件,完全支持开闭原则,设计上支持可扩展支持任意主流数据库,目前组件只实现了Oracle.MS SQL.MySQL三种库. 该组件实现简单.架构清晰,目前组件只包括5个类文件,兼容了三种数据库,组件实现采用了单例模式.工厂模式. 获取组件源码请入QQ群706224870,在群文件中下载.入群验证信息:codefc 下面简单描述下实现思路: 5个类文件如下:D

Django中ORM介绍和字段及字段参数

https://www.cnblogs.com/liwenzhou/p/8688919.html Django中ORM介绍和字段及字段参数 Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中. ORM在业务逻辑层和数据库

HTML5中canvas介绍

1.什么是Canvas canvas 是 HTML5 提供的一个用于展示绘图效果的标签 canvas 提供了一个空白的图形区域,可以使用特定的JavaScript API来绘画图形(canvas 2D或WebGL) 首先由 Apple 引入的,用于OS X的仪表盘 和 Safari 浏览器 1.1 关于Canvas的一些说明 canvas 是一个矩形区域的画布,可以用JavaScript在上面绘画.控制其每一个像素. canvas 标签使用 JavaScript 在网页上绘制图像,本身不具备绘图

Python中urlopen()介绍

#以下介绍是基于Python3.4.3 一.  简介   urllib.request.urlopen()函数用于实现对目标url的访问. 函数原型如下:urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None) 函数定义如下: def urlopen(url, data=None, timeout=socket._GLOBAL_DEFA

iOS中Block介绍(一)基础

ios开发block的使用指南,以及深入理解block的内存管理,也适用于osx开发.讨论范围:block的使用,内存管理,内部实现.不包含的内容:gc arc下的block内存,block在c++中的使用. AD: 一.概述 Block是C级别的语法和运行时特性.Block比较类似C函数,但是Block比之C函数,其灵活性体现在栈内存.堆内存的引用,我们甚至可以将一个Block作为参数传给其他的函数或者Block. 二.热身 先看一个比较简单的Block例子: int multiplier =

linux中日志介绍

linux日志 linux日志大多是以明文存储,一般存储在/var/log目录中,linux系统中主要有三个日志子系统:连接时间日志,进程统计日志,错误日志. 连接时间日志 连接时间日志是有多个程序执行的,把日志记录到/var/log/wtmp     /var/run/utmp   /var/log/lastlog三个文件中,这三个文件记录了用户登录系统和退出的有关信息,utmp保存了当前用户的每个用户的信息,wtmp记录了每个用户登录注销和系统的启动,关机的事件,lastlog记录了每个用户

java中JOB介绍与Spring中JOB的配置

2013-09-05 15:30:54| 分类: 默认分类 |举报|字号 订阅1定时器的作用 在实际的开发中,如果项目中需要定时执行或者需要重复执行一定的工作,定时器显现的尤为重要. 当然如果我们不了解定时器就会用线程去实现,例如: package org.lzstone.action public class FinanceAction extends Thread{ private Date date; public void run{ try{ while(true){ Thread.sl