ダリアメモ@ブログ

日々思ったことや自分用のメモも含めプログラムの技術を淡々と書いていきます

GroupByの第2引数を使って、Selectで射影したインデックス付き配列を射影前の型だけ参照できるようにする

概要

以下の様に配列のインデックスによってGroupByでグループ分けしたいときがありました。 よくありそうな手法としてSelectでインデックス付き配列に変換してからグループ化するとします。

numbers = new int[]{0,1,2,3,4,5}; //数は適当です
gridNumbers = numbers
.Select((number,index) => new {Number = number, Index = index})
.GroupBy(numbers => numbers.Index / 2); //仮として2で割った値の数でグループを作ります
foreach(var gridNumber in gridNumbers)
{
    Consol.WriteLine(gridNumber);
} 
0
0
0
1
1
1

GroupByで分けてみたものの、グループ分けのためだけに作ったIndexをこれ以降使わないとしたら、インデックスだけなくして元に戻したくなりますよね。 そんなときに、GroupByの第2引数を使えばもとに戻せることを知ったので、上記のコードを改善してみようと思います。

改善

先程のGroupByのところを以下のように直してみます。

.GroupBy(numbers => numbers.Index / 2, numbers => numbers.number);  //仮として2で割った値の数でグループを作って、第2引数で入れたnumberだけを抽出する

こうすることでインデックスは今後インテリジェンスで参照できなくなったので、スッキリしました。 小ネタ程度の記事ですが、ぐぐっても出てこなかったのでまとめてみました。