C#とLINQでFizzBuzz

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        // FizzBuzzの無限リスト
        var FizzBuzz = Enumerable.Range(0, int.MaxValue).Select(i =>
            (i % 15 == 0) ? "FizzBuzz" :
            (i % 3 == 0) ? "Fizz" :
            (i % 5 == 0) ? "Buzz" :
            i.ToString());

        // Skipが起点、Takeが表示数に対応する
        FizzBuzz.Skip(1).Take(100).ForEach((s, i) => Console.WriteLine("{0,3}:{1}", i + 1, s));
    }
}

public static class ExtensionMethods
{
    // indexが取れるForEach
    public static void ForEach<T>(this IEnumerable<T> source, Action<T, int> action)
    {
        int index = 0;
        foreach (var item in source) { action(item, index++); }
    }
}

何だかふと思って、今更ながらにanarchy golf - FizzBuzzをやってた。とりあえずC#でSize 123で同率一位達成なので満足です。以上。で終わるのもアレなので、記念にFizzBuzzをきちんと書くならどうなるかなあ、と考えてみた。

C#3.0だとLINQを使うのがきっとスマートです、よね。無限リストを作ってやるのが一番、かな。Skipがstart、Takeがcountに相当するってのが何だか面白い。しかし毎度ながらEnumerable.Range(0,int.MaxValue)という表記が冗長に過ぎてげんなり。あとIEnumerableにForEachが用意されてないのもなあ。ToList()は色々と違うと思うので、本当に何とかして欲しい。

Profile

Yoshifumi Kawai

Cysharp, Inc
CEO/CTO

Microsoft MVP for Developer Technologies(C#)
April 2011
|
July 2022

Twitter:@neuecc GitHub:neuecc

Archive