FlipFlopワンライナー

Algorithm - 0と1を次々と返す簡単なお仕事

LLじゃないけど、C#でもやってみた。

using System;
class FlipFlop
{
  static void Main(string[] args)
  {
    Func<bool, Func<bool>> flipflop = f => () => {f = !f; return f;};
    var ff = flipflop(false);
    Console.WriteLine(ff());
    Console.WriteLine(ff());
    Console.WriteLine(ff());
    Console.WriteLine(ff());
  }
}

C#偉いな。核心部分はたった一行。素敵じゃないか。

でも、ここのところ、LINQかぶれの僕としては、IEnumerableにしたい。

using System;
using System.Collections.Generic;
class FlipFlop
{
  static IEnumerable<bool> flipflop(bool f = false)
  {
    for(int i = f ? 1 : 0;; i++) yield return (i & 1) == 1;
  }
  
  static void Main(string[] args)
  {
    foreach(bool v in flipflop(false))
      Console.WriteLine(v);
  }
}

本当は、

using System;
using System.Collections.Generic;
class FlipFlop
{
  static void Main(string[] args)
  {
    // コンパイルできないよ〜。
    Func<bool, IEnumerable<bool>> flipflop = f => {for(int i = f ? 1 : 0;; i++) yield return (i & 1) == 1;};
    foreach(bool v in flipflop(false))
      Console.WriteLine(v);
  }
}

ってやりたいけど、

ff.cs(8,81): error CS1621: The yield statement cannot be used inside an anonymous method or lambda expression

っていう残念なエラーが。まぁ、これは、あえて切られた機能らしいので仕方ないでしょう。