Log.log(work)

いろんな作業メモ

vb.netメモ。

環境:
Visual Studio2015

LinqでGROUPBYしたい

指定期間で絞った中でGROUPBYでCOUNTのSUMを取りたい

TABLE=FOO

no name date_disp count
01 すずめ 20180301 4
02 めじろ 20180302 2
03 ひばり 20180301 1
01 すずめ 20180302 1
01 すずめ 20180312 5
02 めじろ 20180315 2
01 すずめ 20180322 1
Dim list_DB_ALL As SortableBindingList(Of TBL_FOO) ’FOOテーブルの結果をセット

Dim list_selection = list_DB_ALL _
          .Where(Function(x) x.date_disp > '20180301' And x.date_disp < '20180320' _
          .GroupBy(Function(x) New With {Key x.no, Key x.name },
             Function(k, x)
                     Return New TBL_FOO_SUM With {
                       .no= k.no,
                       .name= k.name,
                       .SUM_COUNT= x.Sum(Function(e) e.count)
                   }
                   End Function).ToList

項目2つでソートしたい

項目AAでソートしたあとに項目BBでソートするときは「ThenBy」を使う。
降順にする場合はOrderByDescending / ThenByDescending を使う。

Dim list= list_DB_ALL.
           Where(Function(x) x.AA= aa).
           OrderBy(Function(x) x.AA).
           ThenBy(Function(s) s.BB).ToList

コンストラクタでコントロールに対するカーソルの設定

MouseEnter時は「↔(左右)」カーソルにして、離れたら(Leave)通常のカーソルにする。

        AddHandler ラベル.MouseEnter,
            Sub(sender, e) Me.Cursor = Cursors.SizeWE
        AddHandler ラベル.MouseLeave,
            Sub(sender, e) Me.Cursor = Cursors.Default

小数点以下X桁を取得

ほんとはROUNDじゃなくてFLOOR(またはTRUNCATE)したかったけどできなかった。

Dim int_a As Interger = 30
Dim int_b As Interger = 31

' 30/31の結果を小数点以下3桁まで取る
'0.96774193 ≒ 0.968
Dim dec_diff As Decimal = CDec(Math.Round( int_a  / int_b , 3, MidpointRounding.AwayFromZero))

MidpointRounding.AwayFromZero以外にMidpointRounding.ToEvenがある。
この2つの違いは丸める方法の違いによる。
AwayFromZeroは四捨五入、ToEvenはバンカー丸め(銀行型丸め/最近接偶数への丸め)。

アプリケーションパス名を取得

'自分自身の実行ファイルのパスを取得する
Dim path As String
path = System.Reflection.Assembly.GetExecutingAssembly.Location

'ディレクトリ名の取得 = System.IO.Path.GetDirectoryName
path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly.Location)