C# 与生成器和序列相关的有趣事情

C# 与生成器和序列相关的有趣事情,c#,linq,iterator,generator,C#,Linq,Iterator,Generator,当你想一部分一部分地完成序列时,还有人觉得迭代器不够用吗 也许我应该开始用F#编写代码(顺便说一句,有人知道F#是否使用惰性求值),但我发现自己需要一种以非常独特的方式提取序列的方法 e、 g 那很管用,但我不喜欢,太难看了。那么我可以这样做吗 var it = "a,b,c".GetSplit(','); string a; var c = it.Yield(out a).Skip(1).First(); 那更好。但我想知道是否有其他方法可以概括相同的语义,也许这已经足够好了。通常我在做一些

当你想一部分一部分地完成序列时,还有人觉得迭代器不够用吗

也许我应该开始用F#编写代码(顺便说一句,有人知道F#是否使用惰性求值),但我发现自己需要一种以非常独特的方式提取序列的方法

e、 g

那很管用,但我不喜欢,太难看了。那么我可以这样做吗

var it = "a,b,c".GetSplit(',');
string a;
var c = it.Yield(out a).Skip(1).First();
那更好。但我想知道是否有其他方法可以概括相同的语义,也许这已经足够好了。通常我在做一些嵌入式字符串解析,这时会弹出这个对话框

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

var s=“abc”;
可数a;
var b=s.跳过(1).分叉(a);
var s2=新字符串(a.ToArray());//“卑诗省”
var s3=新字符串(b.ToArray());//“卑诗省”
最后一个,一开始可能没有那么有用,我发现它相当方便地解决了回溯问题


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

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


例如,您的字符串示例看起来可以作为解析器来编写:也就是说,一个函数使用流中的一系列字符,并使用内部状态来跟踪它在流中的位置。

“有人知道F#是否使用延迟求值”-默认情况下不是这样。F#序列像C#一样是惰性的(它们也是
IEnumerable
)。F#有lambda函数(同样,像C#)和一些用于延迟计算值的语法糖(编译为下面的函数)。考虑到什么目的?拥有语法/方法等是很好的-但是除非你知道一个有效的合理的用例。。。为什么要麻烦?关于叉子,“推LINQ”(MiscUtil)可能会引起人们的兴趣。智力刺激?逗乐我吧。。。有时候我只是喜欢做研究。我得检查一下推林克。你和乔恩,马克做的推林克的事情到底有什么用?你知道,我真正想要的是什么。我希望像Boost精神、元编程和操作符重载这样的东西,基本上创建一个C++的DSL,它可以用来消耗字符串输入。它是一个非常复杂的编译器,它会减慢程序编译的速度,但是它很有效,而且有一些强大的C++语言的语言是很酷的。从根本上说,它仍然在使用字符流,但在这个级别上,描述一些高级功能真的很难。这正是我在这里要做的。我从来没有见过我喜欢的C#解析器框架。你提到了F#;这里有
fslex
/
fsyacc
(电源组的一部分)或
FParsec
库。真的吗?你知道,函数编程语言一直都很支持这一点。也许我应该在F中滚动一些解析器,但通过C使用它们。。。这是有道理的。顺便说一句,你试过Coco/R的C#吗?有点不错。这是一个C语言的编译器生成器,也许你可以区分这两者。它从根本上不同于精神,但最终它做了同样的事情。
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"