据我了解,IEnumerable和IQueryable是延迟执行。为什么IList不支持延期执行会有什么好处呢?
答案 0 :(得分:34)
我想的时间越长,我就越怀疑“延期执行”的整个概念是否实际上具有教育价值。
我会否认这个问题来回答你的问题。 IEnumerable<T>
,IQueryable<T>
和IList<T>
不以任何方式表示“延迟”或“急切”计算。
相反,接口代表提供服务的能力。 IEnumerable<T>
代表服务“我可以提供T类型的一个序列,可能是无限的,一次一个”。 IQueryable<T>
表示服务“我可以代表对数据源的查询,并按需提供该查询的结果”。 IList<T>
表示服务“我可以随机访问可能可变的,有限大小的T类型项目列表”。
这些服务都没有说明服务提供商的实施细节。 IList<T>
服务的提供者可能完全是懒惰的; IQueryable<T>
服务的提供者可能完全渴望。如果你想做一个延期执行IList<T>
,你就可以了。没有人阻止你!
答案 1 :(得分:21)
IList<T>
支持通过索引器进行随机访问 - 以及Count
属性。这两者都违背了使用流式数据延迟执行的精神,除非你建议你真的只是想要一旦你访问任何东西就加载整个列表的东西。如果这就是你所追求的,Lazy<T>
可能是票......
答案 2 :(得分:8)
正如@Joe所指出的那样,IList<T>
抽象出一个名词。 IEnumerable<T>
和IQueryable<T>
是动词的抽象。
IList<T>
是集合的抽象,可以视为列表。 IEnumerable<T>
和'IQueryable抽象操作:对基础集合中包含的项进行枚举或查询。
答案 3 :(得分:3)
思考你所说的内容的后果。
什么会推迟,直到什么时候?
在IEnumerable
和IQueryable
的情况下,延迟的是枚举。并且接口不会暴露任何依赖于枚举的其他内容。
答案 4 :(得分:2)
有很多原因,只有一些:
IList
应与基础数据源独立
用于创建IList
IList
成员预计为O(1) - 延迟执行无法保证 - 访问速度可能非常慢,至少是第一次。IList
成员不应该产生异常,因为访问时IList
的构造方式(延迟执行会出现各种各样的问题,想想也就是说不能访问原始数据源) - 这可以追溯到第一点。