Tag: yield return

如何转换此迭代器阻止function更改?

给出以下代码片段: public class Foo { public IEnumerable Sequence { get; set; } public IEnumerable Bar() { foreach (string s in Sequence) yield return s; } } 以下代码片段在语义上是等价的,还是不同? 如果它不同,它们如何以不同的方式运作? public class Foo2 { public IEnumerable Sequence { get; set; } public IEnumerable Bar2() { return Sequence; } } 这个问题的灵感来自于这个问题 ,它提出了一个类似情况的不同问题。

Parallel.Foreach +收益率回报?

我想用这样的并行循环处理一些东西: public void FillLogs(IEnumerable computers) { Parallel.ForEach(computers, cpt=> { cpt.Logs = cpt.GetRawLogs().ToList(); }); } 好的,它工作正常。 但是如果我想让FillLogs方法返回一个IEnumerable怎么办? public IEnumerable FillLogs(IEnumerable computers) { Parallel.ForEach(computers, cpt=> { cpt.Logs = cpt.GetRawLogs().ToList(); yield return cpt // KO, don’t work }); } 编辑 似乎不可能……但我使用这样的东西: public IEnumerable FillLogs(IEnumerable computers) { return computers.AsParallel().Select(cpt => cpt); } 但是我放了cpt.Logs = cpt.GetRawLogs().ToList(); 指令

具有“产量”的function如何正常工作?

我得到了这个方法(在Unity C#Script中),但我不明白“yield”部分是如何工作的。 我从MSDN中知道该函数将返回一个我可以迭代的IEnumerator,但是这段代码等待1.5秒并且没有迭代,因为这意味着,内部创建的对象被多次创建。 这里的任何人都可以解释一下这段代码的工作原理 IEnumerator DestroyShip() { // create new gameobject Instantiate(ExplosionPrefab, transform.position, transform.rotation); // make current gameobject invisible gameObject.renderer.enabled = false; // set new position for the current gameobject transform.position = new Vector3(0f, transform.position.y, transform.position.z); // wait for 1,5 seconds yield return new WaitForSeconds(1.5f); // make the current gameobject visible again gameObject.renderer.enabled = true; […]

yield语句中的yield返回

如果我在一个锁定语句中有一个收益率回报,锁定会在每个收益率上取消(在下面的例子中为5次),或者只对列表中的所有项目取消一次? 谢谢 private List _data = new List(){“1″,”2″,”3″,”4″,”5”}; private object _locker =new object(); public IEnumerable GetData() { lock (_locker) { foreach (string s in _data) { yield return s; } } }

返回IEnumerable时是否有理由不使用’yield return’?

简单的例子 – 你有一个返回IEnumerable的方法或属性,调用者在foreach()循环中迭代它。 你应该总是在你的IEnumerable方法中使用’yield return’吗? 有没有理由不去? 虽然我知道它可能并不总是有必要,甚至“更好”(例如,它可能是一个非常小的集合),是否有理由主动避免这样做? 让我思考这个问题的代码是我写的一个函数非常类似于这个post中接受的答案 – 我如何遍历日期范围?

如何从.NET 4.5中的并行任务中获益

我想使用.NET迭代器和并行Tasks / await?。 像这样的东西: IEnumerable Foo(IEnumerable source) { Parallel.ForEach( source, s=> { // Ordering is NOT important // items can be yielded as soon as they are done yield return ExecuteOrDownloadSomething(s); } } 不幸的是.NET无法原生地处理这个问题。 迄今为止@svick的最佳答案 – 使用AsParallel()。 奖励:任何实现多个发布者和单个订阅者的简单异步/等待代码? 订阅者将屈服,并且pubs将处理。 (仅核心库)

我如何使`await …`使用`yield return`(即在迭代器方法中)?

我现有的代码看起来类似于: IEnumerable GetStuff() { using (SqlConnection conn = new SqlConnection(connectionString)) using (SqlCommand cmd = new SqlCommand(sql, conn) { conn.Open(); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { SomeClass someClass = f(reader); // create instance based on returned row yield return someClass; } } } 看来我可以通过使用reader.ReadAsync()获益。 但是,如果我只修改一行: while (await reader.ReadAsync()) 编译器通知我await只能在标记为async方法中使用,并建议我将方法签名修改为: async Task<IEnumerable> GetStuff() 但是,这样做会使GetStuff()无法使用,因为: GetStuff()的主体不能是迭代器块,因为Task<IEnumerable>不是迭代器接口类型。 我确信我错过了异步编程模型的关键概念。 […]