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行で書きたい人は一定数いらっしゃるようなので、そういった方々のお役に立てれば幸いです(?)

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

Excelスピル機能のAND,ORを用いた論理演算

仕事でExcelを使っていた際にスピル機能でちょっと躓き、参考になる記事も中々出てこなかったのでメモ。

ExcelでIF関数を使用することは多々あると思うのですが、スピル機能が実装されてからしばらく経つので積極的にスピルを使っていこうと思った際、AND関数にスピルを渡すと入力が反映されない現象に遭遇しました。

続きを読む