问题标签 [yield]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
10792 浏览

c# - 将此 foreach 收益率重写为 linq 收益率?

假设我有以下代码(缩小范围以限制问题范围)

我想将它们重写为这样的东西(当然不会编译

关键是在我的第一个片段中,我有两个 foreach 枚举器产生,我不知道如何在 linq 中执行此操作而不会丢失我的延迟加载功能。

0 投票
3 回答
4298 浏览

c# - C# 中的 Fibers:它们是否比迭代器更快,人们使用过它们吗?

因此,我与一位同事讨论了有关Fiber的问题,并从 2003 年开始阅读这篇论文,该论文描述了使用 Fiber API 在 C# 中实现协程。

本文中的实现Yield是针对 .NET 1.1 的,因此它早yield return于 .NET 2.0 中出现的语法。

乍一看,这里的实现可能更快,并且可以很好地跨多个 CPU 扩展。

有人用过吗?

0 投票
4 回答
7190 浏览

c# - (错误)使用 C# 迭代器实现协程的陷阱

我正在编写重构 Silverlight 程序以从 WCF 服务中使用其现有业务逻辑的一部分。在这样做时,我遇到了 Silverlight 3 中的限制,它只允许异步调用 WCF 服务,以避免长时间运行或无响应的服务调用阻塞 UI 线程的情况(SL 有一个有趣的队列模型来调用 WCF 服务在 UI 线程上)。

因此,编写曾经很简单的东西,正变得越来越复杂(请参阅我问题末尾的代码示例)。

理想情况下,我会使用协程来简化实现,但遗憾的是,C# 目前不支持将协程作为本地语言工具。但是,C# 确实具有使用yield return语法的生成器(迭代器)的概念。我的想法是重新使用 yield 关键字,让我可以为相同的逻辑构建一个简单的协程模型。

但是,我不愿意这样做,因为我担心可能存在一些我没有预料到的隐藏(技术)陷阱(鉴于我对 Silverlight 和 WCF 的经验相对缺乏)。我还担心未来的开发人员可能不清楚实现机制,并且可能会阻碍而不是简化他们未来维护或扩展代码的努力。我在 SO 上看到过这个关于重新使用迭代器来构建状态机的问题:使用“yield”关键字实现状态机,虽然这与我正在做的事情不完全相同,但它确实让我停下来。

但是,我需要做一些事情来隐藏服务调用的复杂性并管理此类更改中的工作量和潜在的缺陷风险。我对可以用来解决这个问题的其他想法或方法持开放态度。

代码的原始非 WCF 版本如下所示:

重构的 WCF 版本变得更加复杂(即使没有异常处理和前置/后置条件测试):

上面的代码显然是一种简化,因为它省略了异常处理、无效性检查和其他在生产代码中必需的做法。尽管如此,我认为这表明 Silverlight 中的异步 WCF 编程模型开始出现复杂性的迅速增加。重构原始实现(不使用服务层,而是将其逻辑嵌入到 SL 客户端中)很快就会成为一项艰巨的任务。而且很可能很容易出错。

代码的协程版本看起来像这样(我还没有测试过):

上面的代码中有各种各样的地方需要改进。但基本前提是分解延续模式(为异常处理和各种检查创建一个拦截点),同时允许 WCF 的基于事件的异步模型在执行每个步骤时驱动 - 基本上是在最后一个异步 WCF 调用完成时。虽然从表面上看,这看起来像是更多的代码,但值得一提的是,它PerformSteps()NextStep()可重用的,只是其中的实现ButtonClickCoRoutine()会随着每个不同的实现站点而改变。

我不完全确定我喜欢这个模型,如果存在更简单的方法来实现它,我不会感到惊讶。但我无法在“interwebs”或 MSDN 或其他任何地方找到一个。在此先感谢您的帮助。

0 投票
3 回答
8013 浏览

python - 那里有类似于 Python 中 Java 的 Thread.yield() 的东西?这甚至有意义吗?

我想告诉我的 Python 线程让步,从而避免不必要地占用 CPU。在 Java 中,您可以使用该Thread.yield()函数来做到这一点。我认为 Python 中没有类似的东西,所以我一直在使用time.sleep(t)where t = 0.00001。因为t=0似乎没有效果。

我认为也许我对 Python 的线程模型没有正确理解,因此缺少thread.yield(). 有人可以向我澄清这一点吗?谢谢!

PS:这是Java的文档Thread.yield()所说的:

使当前正在执行的线程对象暂时暂停并允许其他线程执行。

0 投票
2 回答
18014 浏览

python - 这个类如何在不实现“next”的情况下实现“__iter__”方法?

我在 django.template 中有以下代码:

我感到困惑的部分如下。这种方法是如何__iter__工作的?我找不到任何对应next的方法。

这是我知道如何实现的唯一方法__iter__

在你的答案中,尽量使用代码示例而不是文本,因为我的英语不是很好。

0 投票
3 回答
3559 浏览

c# - 在 Nerd Dinner 教程中有趣地使用 C# yield 关键字

通过教程(Professional ASP.NET MVC - Nerd Dinner),我遇到了这段代码:

我已经阅读了yield,但我想我的理解仍然有点模糊。它似乎要做的是创建一个对象,该对象允许循环遍历集合中的项目,而无需实际执行循环,除非并且直到绝对必要。

不过,这个例子对我来说有点奇怪。我认为它正在做的是延迟任何RuleViolation实例的创建,直到程序员使用for each或者使用 LINQ 扩展方法(如.ElementAt(2).

不过,除此之外,我还有一些问题:

  1. if何时评估语句的条件部分?何时GetRuleViolations()调用或何时实际迭代可枚举?换句话说,如果在我调用的时间和我尝试实际迭代它的时间之间的值Titlenullto变化,是否会被创建?Really Geeky DinnerGetRuleViolations()RuleViolation("Title required", "Title")

  2. 为什么是yield break;必要的?它到底在这里做什么?

  3. 假设Title是 null 或空。如果我调用GetRuleViolations()then 连续两次迭代生成的可枚举,将new RuleViolation("Title required", "Title")调用多少次?

0 投票
4 回答
577 浏览

c# - C# - Yield 给出了一个不可用的类型

我有一个类和一组 IEnumerables,它们正在使用这个类来给我一个列表中的列表。(有关详细信息,请参阅此问题的答案。)

这是代码:

和班级:

我将此结果设置为我的 ListBox 的 ItemsSource

当我尝试捕获此列表框的事件时,问题就出现了:

当我在调试时检查 e.AddedItems[0] 并且它说它的类型是 EnumerateColumns。

当我尝试转换为该类型时,Visual Studio 说(可以理解) EnumerateColumns 是一种方法,但用作类型。

那么,我怎样才能按类型引用它,以便我可以执行一个 foreach 循环并获取其中的内容呢?


这是我根据答案更新的代码:

0 投票
4 回答
409 浏览

c# - 通过使用 yield 或更改算法来优化代码

下面的代码有效,但我想使用 yield 或更改算法来优化代码。

0 投票
6 回答
37250 浏览

java - 是否有与 C# 的“yield”关键字等效的 Java?

我知道 Java 本身没有直接的等价物,但也许是第三方?

真的很方便。目前我想实现一个迭代器,它产生树中的所有节点,大约有五行代码。

0 投票
8 回答
30637 浏览

python - Python:生成器表达式与产量

在 Python 中,通过生成器表达式创建生成器对象与使用yield语句之间有什么区别吗?

使用产量

使用生成器表达式

这两个函数都返回生成元组的生成器对象,例如 (0,0)、(0,1) 等。

一个或另一个的任何优点?想法?