C#:IEnumerable,ICollection,IList,IQueryable的区别
一.他们之间的关系可简单描述如下图:
二.定义如下
public interface IEnumerable<out T> : IEnumerable
public interface ICollection<T> : IEnumerable<T>, IEnumerable
public interface IList<T> : ICollection<T>, IEnumerable<T>, IEnumerable
public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable
按照功能排序:1. List<T> =》2.IList<T>=》 3. ICollection<T> =》4.IEnumerable<T>
按照性能排序:1.IEnumerable<T> =》2.ICollection<T>=》3.IList<T>=》4.List<T>
三.分别说明
1.IEnumerable接口
理解:
1)IEnumerable接口是ICollection的父接口,凡实现此接口的类,都具备“可迭代”的能力(即用foreach遍历,但连Count都不能获取,不允许添加、删除等)。
2)IEnumerable接口只定义了一个方法:GetEnumerator,该方法将返回一个“迭代子”对象(或称为迭代器对象),是一个实现了IEnumerator接口的对象实例。
3)支持使用where linq查询
方法与属性如下:
1)MoveNext():该方法移动下集合的下一个元素上,如果有这个元素,该方法就返回true。如果集合不再有更多的元素,该方法就返回false
2)Current:属性Current返回光标所在的元素
3)Reset():该方法将光标重新定位于集合的开头。许多枚举会抛出NotSupportedExcepetion异常
2.ICollection<T>
理解:
1)该接口可以确定集合的大小(Count),
2)集合是否包含某个元素(Contains),
3)复制集合到另外一个数组(ToArray),
4)集合是否是只读的(IsReadOnly)。
5)如果一个集合是可编辑的,那么可以调用Add,Remove和Clear方法操作集合中的元素。
6)因为该接口继承IEnumerable<T>,所以可以使用foreach语句遍历集合,支持where linq查询
方法与属性如下:
1)Count:该属性可确定集合中的元素个数,它返回的值与Length属性相同
2)IsSynchronized 、SyncRoot:该属性确定集合是否是纯种安全的。对于数组,这个属性总是返回false。对于同步访问,SyncRoot属性可以用于线程安全的访问 。
3)CopyTo():该方法可以将数组的元素复制到现有的数组中,它类似于表态方法Array.Copy()
3.IList<T>
方法与属性如下:
1).Add():该方法用于在集合中添加元素。对于数组,该方法会抛出NotSupportedException异常。
2).Clear():该方法可以清除数组中的所有元素。值类型设置为0,引用类型设置为NULL
3).Contains():该方法可以确定某个元素是否在数组中。其返回值是true或false.这个方法会对数组中的所有元素进行线性搜索,直到找到所需元素为止。
4).IndexOf():该方法与Contains()方法类似,也是对数组中的所有元素进行线性搜索。不同的是IndexOf()方法会返回所找到的第一个元素的索引。
5).Insert()、Remove()、RemoveAt():对于集合,Insert()方法用于插入元素,Remove()和RemoveAt()可删除元素。对于数组,这些方法都抛出NotSupportedException异常
6).IsFixedSize:数组的大小总是固定的,所以这个属性问题返回true
7).IsReadOnly:数组总是可读/写的,所以这个属性返回false.
8).Item:该属性可以用整形索引访问数组。
摘自stackoverflow的回答:
https://stackoverflow.com/questions/20160943/comparison-between-list-ilist-and-ienumerable
ref:
https://blog.csdn.net/tf576776047/article/details/8845884
https://www.cnblogs.com/zhao987/p/12606579.html
https://blog.csdn.net/qq_34573534/article/details/103592999
https://www.pianshen.com/article/28311499981/
https://www.c-sharpcorner.com/UploadFile/78607b/difference-between-ienumerable-icollection-and-ilist-interf/
本文来自博客园,转载请注明原文链接:https://www.cnblogs.com/keeplearningandsharing/p/15791982.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Blazor Hybrid适配到HarmonyOS系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库