首页 > 编程语言 >C#集合:ICollection和IList接口

C#集合:ICollection和IList接口

时间:2022-08-26 14:15:11浏览次数:73  
标签:get C# ICollection IEnumerable int IList void

虽然枚举接口IEnumerable提供了一种向前迭代集合的协议,但是它们并没有提供确定集合大小、根据索引访问成员、搜索以及修改集合的机制。为了实现这些功能,.NET Core定义了ICollectionIListIDictionary接口。这些接口都支持泛型和非泛型版本。然而,非泛型版本的存在只是为了兼容遗留代码。
可以简单总结为:

  • IEnumerable<T>(和IEnumerable):提供了最少的功能支持(仅支持元素枚举)。
  • ICollection<T>(和ICollection):提供一般的功能(例如Count属性)。
  • IList<T>/IDictionary<K, V>及其非泛型版本:支持最多的功能(包括根据索引/键进行“随机”访问)。

ICollection<T>和ICollection

ICollection<T>是可以对其中的对象进行计数的标准集合接口。它可以确定集合大小(Count),确定集合中是否存在某个元素(Contains),将集合复制到一个数组(ToArray)以及确定集合是否为只读(IsReadOnly)。对于可写集合,还可以对集合元素进行添加(Add)、删除(Remove)以及清空(Clear)操作。由于它扩展自IEnumerable<T>,因此也可以通过foreach语句进行遍历。

public interface ICollection<T> : IEnumerable<T>, IEnumerable
{
    int Count { get; }
    bool IsReadOnly { get; }
    void Add(T item);
    void Clear();
    bool Contains(T item);
    void CopyTo(T[] array, int arrayIndex);
    bool Remove(T item);
}

非泛型的ICollection也提供了计数的功能,但是它并不支持修改或检查集合元素的功能:

public interface ICollection : IEnumerable
{
    int Count { get; }
    object SyncRoot { get; }
    bool IsSynchronized { get; }
    void CopyTo(Array array, int index);
}

IList<T>和IList

IList<T>是按照位置对集合进行索引的标准接口。除了从ICollection<T>IEnumerable<T>继承的功能之外,它还可以按位置(通过索引器)读写元素,并在特定位置插入/删除元素。

public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable
{
    T this[int index] { get; set; }
    int IndexOf(T item);
    void Insert(int index, T item);
    void RemoveAt(int index);
}

IndexOf方法可以对列表执行线性搜索,如果未找到指定的元素则返回-1。
IList的非泛型版本具有更多的成员,因为(相比泛型版本)它从ICollection继承过来的成员比较少:

public interface IList : ICollection, IEnumerable
{
    object this[int index] { get; set; }
    bool IsReadOnly { get; }
    bool IsFixedSize { 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);
}

非泛型的IList接口的Add方法会返回一个整数代表最新添加元素的索引。相反,ICollection<T>Add方法的返回类型为void

通用的List<T>类实现了IList<T>IList两种接口。C#的数组同样实现了泛型和非泛型版本的IList接口。

IReadOnlyCollection<T>与IReadOnlyList<T>

.NET Core同样定义了一系列仅提供只读操作的集合及列表接口:

public interface IReadOnlyCollection<out T> : IEnumerable<T>, IEnumerable
{
    int Count { get; }
}
public interface IReadOnlyList<out T> : IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable
{
    T this[int index] { get; }
}

由于上述接口的类型参数仅仅在输出时使用,因此被标记为协变参数。这样我们就可以将一个“猫咪”的列表表示为一个“动物”的只读列表。

相反,在IList<T>ICollection<T>中,由于T在输入输出时均被使用,因此没有标记为协变参数。

标签:get,C#,ICollection,IEnumerable,int,IList,void
From: https://www.cnblogs.com/nullcodeworld/p/16627354.html

相关文章

  • NCH Prism Plus for mac(视频格式转换器)
    NCHPrismPlusformac是一款Mac视频格式转换器,NCHPrismPlusmac版轻松转换视频!Prism转换avi,mpg,vob,asf,wmv,mp4,amv以及所有具有基于DirectShow的编解码器的视频格,如果您可......
  • Linux-Centos 用crontab定时运行python脚本详细步骤
    服务器运行定时任务操作步骤:1.编辑crontab配置命令:  crontab-e可进行编辑定时任务  crontab-l查看定时任务列表 crontab-r删除定时任务 servicecro......
  • Git操作之 git add 撤销、git commit 撤销
    1、gitadd添加多余文件撤销操作gitresetHEAD后面什么都不跟的,就是上一次add里面的内容全部撤销gitresetHEADXXX后面跟文件名,就是对某个文件进行撤销2、gitco......
  • 【转载】JDK8中computeIfAbsent方法
    转载https://blog.csdn.net/sinat_34241861/article/details/107821860麻烦的方法Map<String,List<String>>map=newHashMap<>();List<String>list;//一般这......
  • android 混淆 minifyEnabled proguard-rules.pro consumer-rules.pro
    名词解释minifyEnabled是否启动混淆ture:打开false:关闭proguard-rules.pro文件是给Library模块自己使用的混淆规则consumer-rules.pro文件则是会合并到app的混淆规......
  • ant-design上传组件方法beforeUpload返回false或promise.reject仍然失效
    问题描述:在使用antdesign框架的Upload上传组件时,相信很多人做过上传文件的格式、大小、数量、或其他依赖条件等的限制,这些限制一般都是需要在beforeUpload方法中进行处理......
  • macOS12.5安装Xcode
    1最好是直接去官网下载历史版本的安装包,下载下来安装就好了;2如果你选择APPstore,下载+安装可能要好久,可能网络好的时候很快下载完,但是会一直卡在安装页面:  这个时候......
  • 使用Azure DevOps 进行 docker .net core 自动部署
    下载代理代理服务器池的作用用于CI也可以用于CD主要用于编译打包部署的话使用部署池当前下载到本地了https://vstsagentpackage.azureedge.net/agent/2.188.4/vsts-......
  • CF1060F
    所以为什么$n$是50啊(感觉真的,太难想了。首先各个点的答案可以分开算,假设当前点为x.其次这个期望没啥意义,直接先计算方案数再除一下就行了。还有就是只有删边是有一......
  • mybatis-config.xml配置
    <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN""http://mybatis.org/dtd/mybatis-3-conf......