似たコード(ループ)の整理

ざっくり以下のようなコードを組みたててから遠目に見ると、ほとんど同じだ、と気づく:

if (packed)
{
    var value = read(stream);
    while (count-- != 0)
    {
        yield return value;
    }
}
else
{
    while (count-- != 0)
    {
        yield return read(stream);
    }
}

前半は先に読んだ値を count 回繰りかえして返す。後半は count 回、呼ばれるたびに値を読んで返す。
count 回の繰りかえしは共通しているので、値を返す部分を事前にまとめることで共通化できる。こんな感じ:

Func<int> repeat(int value) => () => value;
var value = packed ? repeat(read(stream)) : () => read(stream);
while (count-- != 0)
{
    yield return value();
}

この記事が気に入ったらサポートをしてみませんか?