代码之家  ›  专栏  ›  技术社区  ›  John Leidegren

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

  •  4
  • John Leidegren  · 技术社区  · 14 年前

    当您想一个部分一个序列一个部分地进行时,是否还有其他人认为迭代器不够用?

    也许我应该开始用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,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 回复  |  直到 14 年前
        1
  •  1
  •   Tim Robinson    14 年前