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/

 

 

posted @   katesharing  阅读(270)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Blazor Hybrid适配到HarmonyOS系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
点击右上角即可分享
微信分享提示