これが私が最終的に使用したものです。phgの回答とほぼ同じ構造です。
基本的に、これは以下を含む Tuple を維持する集計関数です。 1: 蓄積されたデータ。2: パーサーの状態。
集計関数は、if-else を実行して、現在調べているアイテムがグループ ヘッダーか通常のアイテムかを確認します。これに基づいて、データストア (タプルの最後の部分) を更新したり、パーサーの状態 (タプルの最初の部分) を変更したりします。
私の場合、パーサーの状態は現在アクティブなリストです (次のアイテムが挿入されます)。
var sequence = new[]{ "1","A","B","C","2","F","K","L","5","6","P","I","E"};
var aggr = Tuple.Create(new List<string>(), new Dictionary<int,List<string>>());
var res = sequence.Aggregate(aggr, (d, x) => {
int i;
if (Int32.TryParse(x, out i))
{
var newList = new List<string>();
d.Item2.Add(i,newList);
return Tuple.Create(newList,d.Item2);
} else
{
d.Item1.Add(x);
return d;
}
},d=>d.Item2);