C#中集合接口关系笔记

IEnumerable

IEnumerable接口是所有集合类型的祖宗接口,其作用相当于Object类型之于其它类型。如果某个类型实现了IEnumerable接口,就意味着它可以被迭代访问,也就可以称之为集合类型(可枚举);

ICollection

ICollection继承于IEnumerable接口,并且扩展了IEnumerable接口。

主要扩展的功能有:

  1. 新增了属性Count,用于记录集合元素个数

  2. 支持添加元素和移除元素

  3. 支持是否包含某元素

  4. 支持清空集合等等

对于任何实现了ICollection接口的集合,我们都可以通过第1条Count属性获取当前集合的元素数,所以这些集合也被称为计数集合。

IList

IList接口直接继承于ICollection接口和IEnumerable接口,并且扩展了通过索引操作集合的功能。

主要扩展的功能有:

  1. 通过索引获取集合中某个元素

  2. 通过元素获取元素在集合中的索引值

  3. 通过索引插入元素到集合指定位置

  4. 移除集合指定索引处的元素

IDictionary

IDictionary接口直接继承于ICollection接口和IEnumerable接口,存储的元素是键值对,扩展了通过操作键值对集合的功能。

主要扩展的功能有:

  1. 通过键KEY获取值VALUE

  2. 插入新的键值对{KEY:VALUE}

  3. 是否包含KEY

  4. 通过KEY移除键值对元素

=======================================================

当我们使用到EF时,不得不说 IEnumerable(集合) 和 IQueryable(EF里的DbSet<T>) 里的 SQO 本质不一样!:

      集合 的 标准查询运算符 方法 ,是来自于 System.Linq.Enumerable 里 给 IEnumerable 接口添加的扩展方法 

      EF上下文里的 DBSet<T> 里的 标准查询运算符 方法,来自于 System.Linq.Queryable 里给 IQueryable接口 添加的扩展方法

      EF的集合中采用IQueryable接口原因是,延迟加载,也就是我们查询出来的并不是集合而是

IQueryable<UsersAddress> addrs = db.UsersAddresses.Where(a => a.udUId == 1);   //以接口的方式返回

      之所以返回一个接口,而不是具体的数据集合,因为我们并不知道后面是否还有查询条件,所以采用这种方式去拼接查询条件,如:

      addrs.Where(a=>a.mIsDel==fales);

       这个时候返回的还是接口,还是在拼接条件,并没有生成sql语句去数据库查询,当我们使用到了集合中的变量时或者使用 addrs.ToList();

       就会生成SQL语句真正的去数据库查询数据。

IEnumerable 又叫做本地查询,因为就是在本地内存中的数据集合,IQueryable 的操作并没有查询数据,而是延迟查询

要有多努力才能对得起奔波的脚步和身上的期望
原文地址:https://www.cnblogs.com/hxfcodelife/p/9955402.html