2022/10/10

C# DataGridViewでLinqを使って列集計

DataGridViewの各列ごとに入力されているセルを数え、その最大値を返すコード。
処理したいDataGridViewをvar dgvとしておきます。

単純にforで書くとこう↓
var count = new int[dgv.ColumnCount]; // int[]型
for(int row = 0; row < dgv.RowCount; row++)
{
  for(int col=0; col < dgv.ColumnCount; col++)
  {
    count[col] += !string.IsNullOrEmpty(dgv[col, row].Value?.ToString()) ? 1 : 0;
  }
}
int maxCount = count.Max();

直感的ですね。
次にLinqで同じことをしてみました↓
int maxCount = dgv.Columns.Cast().Max(col => dgv.Rows.Cast().Count(row => !string.IsNullOrEmpty(row.Cells[col.Index].Value?.ToString())));

自分で書いておきながら(これは暗号だ……)と思い、こんなもん「よく分からないけど動く呪文か何か」にしかならないと思い使用をやめましたが、なんだか勿体なかったのでここに供養することにしました。
コレクション処理を何が何でもLinqで1行で書きたい人は一定数いらっしゃるようなので、そういった方々のお役に立てれば幸いです(?)

(読みにくいコードを書くのは極論あとから読まないアセンブリを書いているのと同義で何のための高級言語か分からなくなるので、ご利用は計画的に…)