有趣的事情与发电机和序列

时间:2010-11-09 11:26:49

标签: c# linq iterator generator

当你想要逐个接受序列时,是否还有其他人觉得迭代器会变短?

也许我应该开始在F#中编写我的代码(顺便说一句,任何人都知道F#是否使用惰性评估)但我发现自己想要一种方法以一种非常独特的方式来拉动序列。

e.g。

// string.Split implemented as a generator, with lazy evaluation
var it = "a,b,c".GetSplit(',').GetEnumerator();
it.MoveNext();
var a = it.Current;
it.MoveNext();
it.MoveNext();
var c = it.Current;

这有效,但我不喜欢它,它很难看。我可以这样做吗?

var it = "a,b,c".GetSplit(',');
string a;
var c = it.Yield(out a).Skip(1).First();

那更好。但我想知道是否有另一种推广相同语义的方法,也许这已经足够了。通常我会进行一些嵌入式字符串解析,就在这时就会弹出。

还有一种情况,我希望消耗一个特定点的序列,然后基本上,叉它(或克隆它,这是更好的)。像这样

var s = "abc";
IEnumerable<string> a;
var b = s.Skip(1).Fork(out a);
var s2 = new string(a.ToArray()); // "bc"
var s3 = new string(b.ToArray()); // "bc"

最后一个,起初可能不那么有用,我发现它很方便地解决了回溯问题。

我的问题是我们需要这个吗?或者它是否已经以某种方式存在并且我错过了它?

1 个答案:

答案 0 :(得分:1)

序列基本上可以正常工作,即提供一个简单的界面,按需生成值流。如果您有更复杂的需求,那么欢迎您使用更强大的界面。

例如,您的字符串示例看起来可能有利于编写为解析器:即,一个函数使用流中的一系列字符并使用内部状态来跟踪它在流中的位置。 / p>