LINQでサイズのリストからインデックスに変換する方法

バイト列に格納されたデータのサイズをリストとして持っているとき、それぞれのデータのインデックスにLINQで変換する方法です。

特に目新しいことではないですが、今日全然思い出せなくて手が止まってしまったのでメモしておきます。

簡単な解説

文章での説明が下手で何のこっちゃですが(これが検索しても見つからない理由)、バイト列に下記のようにサイズが異なるデータが格納されているとします。

その場合、下記のリストがデータサイズのリストとして渡されます。

var sizes = new int[] { 2, 1, 1, 4, 2, 4 }; 

データにアクセスするためには矢印で示したインデックスが欲しいので変換します。

あるデータのインデックスは、それ以前に格納されているサイズの合計になります。
n番目のデータだと、

var index = sizes.Take(n).Sum();

こうなります。
大抵の場合はここまでで事足るんじゃないかと書いてて気づきました。

方法

当初の目的、インデックスのリストを得る方法です。

var sizes = new int[] { 2, 1, 1, 4, 2, 4 };
var indexes = sizes.Select((_, index) => sizes.Take(index).Sum());

Console.WriteLine($"Index: {string.Join(',', indexes)}");

出力結果は以下です。良さそうですね。

Index: 0,2,3,4,8,10

あんまり使う機会がない気がするけど、なぜか年1回ぐらい忘れて検索しまくるので次は時短できるぞ(フラグ)