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関数にスピルを渡すと入力が反映されない現象に遭遇しました。

続きを読む

2021/09/12

TrueNASでOpenVPNを設定したお話

以前から自宅で運用していたTrueNASの標準機能で備わっていたOpenVPNを四苦八苦しながらもなんとか稼働にこぎつけられたので、共有兼覚え書きとして書き残しておきます。
主な理由としては、最近外出先から自宅のNASにアクセスする頻度が増えたこと、SSH認証だとたまーに不正アクセス試行があるのと、外出先のFree Wi-Fiを使用したときにVPNを通すことでそれなりに安全なネット環境を構築できることからの理由で着手に至りました。
truenasandopenvpn.png

続きを読む