为什么IList不延期执行?

Jos*_*eld 11 c# collections

据我所知,IEnumerable和IQueryable是延迟执行.为什么IList不支持延迟执行呢?

Eri*_*ert 36

我想的时间越长,我就越怀疑"延期执行"的整个概念是否真的具有教育价值.

我会否认它来回答你的问题.IEnumerable<T>,IQueryable<T>并且IList<T>不以任何方式代表"延期"或"急切"计算.

相反,接口表示提供服务的能力. IEnumerable<T>代表服务"我可以提供T类型的一个序列,可能是无限的,一次一个". IQueryable<T>代表服务"我可以代表对数据源的查询,并按需提供该查询的结果". IList<T>表示服务"我可以随机访问可能可变的,有限大小的T类型项目列表".

这些服务都没有说明服务提供商的实施细节.IList<T>服务提供者可能完全是懒惰的; IQueryable<T>服务提供商可能完全渴望.如果你想做一个延期执行IList<T>,你就可以了.没有人阻止你!

  • 我认为推迟执行的想法具有教学意义,但应该更好地定义-实际上,我之前曾争论过“懒惰”是一个含糊不清的术语,在整个地方以微妙的不同方式使用。(http://msmvps.com/blogs/jon_skeet/archive/2010/03/25/just-how-lazy-are-you.aspx)我仍然不清楚的是(对于)LINQ to Objects有多少用处严格定义其如何使用其输入以及在什么时候使用。(某些现有文档是完全错误的,例如“相交”,但这是另一回事。) (2认同)

Jon*_*eet 21

IList<T>支持通过索引器随机访问 - 以及Count属性.这两者都违背了使用流数据延迟执行的精神,除非你建议你真的只想要一些东西在你访问任何东西时加载整个列表.如果这就是你所追求的,Lazy<T>可能是票......


Nic*_*rey 8

正如@Joe指出的那样,IList<T>抽象出一个名词.IEnumerable<T>并且IQueryable<T>动词的抽象.

IList<T>是一个可以被视为列表的集合的抽象.IEnumerable<T>和'IQueryable抽象动作:对基础集合中包含的项进行枚举或查询.