Tag: iterator

Objective-C到C#的yield关键字是否有任何并行

我第一次在C#中看到yield关键字时,我认为“糟糕的是如何破解语言”。 从那时起成长并实际使用该语言我发现表达状态逻辑非常简单,我想在其他开发平台中使用类似的方法。 我正在探索Objective-C的一些支持实用程序。 是否有类似Objective-C的C#yield关键字?

C#5 ReadAsync和迭代器

我试图将下面的类转换为懒惰返回一个文件。 public class ObservableFile2 : IObservable { private readonly IObservable subject; public ObservableFile2(string fileName) { subject = Observable.Using ( () => new StreamReader(new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read)), streamReader => ObserveLines(streamReader) ); } private IObservable ObserveLines(StreamReader streamReader) { return ReadLines(streamReader).ToObservable(); } private IEnumerable ReadLines(StreamReader streamReader) { while (!streamReader.EndOfStream) { yield return streamReader.ReadLine(); } } public IDisposable […]

可变的值类型包装器,传递给迭代器

我正在编写一个需要传递可变整数的迭代器。 public IEnumerable Foo(ref int valueThatMeansSomething) { // Stuff yield return …; } 这让我知道“错误476迭代器不能有ref或out参数”。 我需要的是在迭代器中修改这个整数值,并由迭代器的调用者使用。 换句话说,无论上面的调用Foo()想要知道valueThatMeansSomething和Foo()的结束值都可以使用它本身。 真的,我想要一个引用类型的整数,而不是值类型。 我唯一能想到的是写一个封装了我的整数的类,允许我修改它。 public class ValueWrapper where T : struct { public ValueWrapper(T item) { this.Item = item; } public T Item { get; set; } } 所以: ValueWrapper w = new ValueWrapper(0); foreach(T item in Foo(w)) { // Do […]

给同一个数据参数相同的实例

我有一个具有这种结构的文本文件: {A, B, C, D} {B, E, D} {C, A, F} …… 第一行表示起始位置,其他行表示目的地。 例如: A -> B, C, D B -> E, D C -> A, F 我有一个名为Location的基本类,我保存所有的位置和目的地。 Location locA = new Location(); Location locB = new Location(); 我有兴趣使用相同的实例位置而不为每个人创建一个新实例,例如: Connection(locA, locB)); Connection(locA, locC)); Connection(locA, locD)); Connection(locB, locE); 问题是当我分割我的文本文件时。 我把第一行放在列表中。 和目的地在另一个列表中。 : DKLocations Startloc = new […]

IEnumerator是否有“HasNext”方法?

使用Java Iterator ,我使用hasNext方法来确定迭代是否有更多元素(不消耗元素) – 因此, hasNext就像一个“ Peek ”方法。 我的问题:C#的通用IEnumerator是否有类似“ hasNext ”或“ Peek ”的方法?

当你可以在lambda中使用await时,为什么不能在lambda中使用yield?

根据Eric Lippert的说法,匿名迭代器没有添加到该语言中,因为实现它会过于复杂。 这对我来说没问题,在他们继续实施匿名异步方法之前,它并没有打扰我。 编译器必须为异步方法做同样的事情,因为它必须用于迭代器(将它们转换为状态机),所以我很困惑为什么匿名迭代器也不允许,当匿名异步方法时。 有人可以对此有所了解吗?

如何转换此迭代器阻止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; } } 这个问题的灵感来自于这个问题 ,它提出了一个类似情况的不同问题。

如何一次迭代两个数组?

我在解析文本文件时构建了两个数组。 第一个包含列名,第二个包含当前行的值。 我需要一次迭代两个列表来构建一个地图。 现在我有以下内容: var currentValues = currentRow.Split(separatorChar); var valueEnumerator = currentValues.GetEnumerator(); foreach (String column in columnList) { valueEnumerator.MoveNext(); valueMap.Add(column, (String)valueEnumerator.Current); } 这很好用,但它并不能完全满足我的优雅感,如果arrays的数量大于2,它会变得非常毛茸茸(我偶尔会这样做)。 有没有人有另一个更高级的成语?