加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 有趣的与生成器和序列有关的事情

发布时间:2020-12-15 21:12:27 所属栏目:百科 来源:网络整理
导读:当你想要一个一个接一个地按顺序参与时,有没有其他人觉得迭代器会变短? 也许我应该开始在F#中编写我的代码(顺便说一下,如果有人知道F#是否使用了懒惰的评估),但我发现自己想要一种以非常独特的方式拉动序列的方法. 例如 // string.Split implemented as a g
当你想要一个一个接一个地按顺序参与时,有没有其他人觉得迭代器会变短?

也许我应该开始在F#中编写我的代码(顺便说一下,如果有人知道F#是否使用了懒惰的评估),但我发现自己想要一种以非常独特的方式拉动序列的方法.

例如

// 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,');
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"

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

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

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读