IEnumerable> を全て繋げて IEnumerable に変換する

単純に考えると、

IEnumerable<IEnumerable<int>> values = ...;

IEnumerable<int> result = new List<int>();
foreach (IEnumerable<int> v in values)
{
    result = result.Concat(v);
}

こんな感じなんだろうけど、これって Accumulate じゃん!とか思ったので、こんなのは拡張メソッドにあるだろうなーと探してみたけどそれっぽいのが見つからない……。
仕方ないので自分で書いてみた。

public static TResult Accumulate<T, TResult>(this IEnumerable<T> values, Func<TResult, T, TResult> f, TResult init)
{
    TResult result = init;
    foreach (T v in values)
    {
        result = f(result, v);
    }
    return result;
}
IEnumerable<IEnumerable<int>> values = ...;

result = values.Accumulate((a, v) => a == null ? v : a.Concat(v), (IEnumerable<int>)null);

どうせ一回しか使わない処理だろうから無駄に遠回りな気がするけど気にしないことにする。



追記:
やっぱりあったみたいなので Accumulate 消して書き直し。

result = values.Aggregate((IEnumerable<int>)null, (a, v) => a == null ? v : a.Concat(v));