我知道是什么yield
,我看过几个例子,但我想不到现实生活中的应用,你用它来解决一些具体问题吗?
(理想情况下,某些其他问题无法解决的问题)
我意识到这是一个老问题(前Jon Skeet?)但我最近一直在考虑这个问题.不幸的是,目前的答案(在我看来)没有提到yield语句最明显的优势.
yield语句的最大好处是它允许您使用更高效的内存使用来迭代非常大的列表,然后使用标准列表.
例如,假设您有一个返回100万行的数据库查询.您可以使用DataReader检索所有行并将它们存储在List中,因此需要list_size*row_size字节的内存.
或者您可以使用yield语句创建Iterator,并且一次只能在内存中存储一行.实际上,这使您能够在大型数据集上提供"流式"功能.
此外,在使用Iterator的代码中,您使用一个简单的foreach循环,并可以根据需要决定从循环中断开.如果你提前中断,当你只需要前5行时(例如),你没有强制检索整个数据集.
关于:
Ideally some problem that cannot be solved some other way
yield语句不会为您提供使用自己的自定义迭代器实现无法完成的任何操作,但它可以节省您需要编写所需的常常复杂代码.很少有问题(如果有的话)无法解决多种问题.
以下是一些最近的问题和答案,提供了更多细节:
收益率关键字增值?
LINQ之外的产量是否有用?
实际上我在我的网站IdeaPipe上以非传统的方式使用它
public override IEnumeratorGetEnumerator() { // goes through the collection and only returns the ones that are visible for the current user // this is done at this level instead of the display level so that ideas do not bleed through // on services foreach (T idea in InternalCollection) if (idea.IsViewingAuthorized) yield return idea; }
所以基本上它检查是否查看该想法目前是否已获得授权,如果是,则返回该想法.如果不是,则跳过它.这允许我缓存Ideas,但仍然将想法显示给授权的用户.否则,我每次必须根据权限重新拉出它们,而它们每1小时只重新排序一次.