VB C# .NET Freamworkの備忘録

C#, VB.NET Freamworkの備忘録を掲載しています。 コントロール、WPF、スレッド、共通関数と実用的なコードを掲載してきます。

■Linqの実行タイミング
Linqは遅延実行されます、メソッドの行を通ったタイミングではなくIEnumerable<T>オブジェクト以外の結果が必要になった時に実行されます。
たとえば、以下のようなデータベースやストレージにアクセスするコードを書いたとします。
var hogeList = Db.HogeTable.Where(x => x.Code == code);

foreach(var h in hogeList)
{
    Console.WriteLine(h.Name);
}

負荷軽減
↓↓↓↓↓↓↓↓

// LINQのデータを一度リストに展開することで、遅延実行を回避する。
var hogeList = Db.HogeTable.Where(x => x.Code == code).ToList().AsQueryable();

foreach(var h in hogeList)
{
    Console.WriteLine(h.Name);
}

ぱっと見、1回のアクセスを行っているように見えますが、ループの回数分アクセスが行われます。メモリ内のコレクションに対するアクセスであればそれほどパフォーマンスに差が出ませんが、外部ストレージ(SQL Azure/Table Storage)へのアクセスの場合一気にパフォーマンスが劣化します。自分が一番ハマったのもこのパターンです。アクセスを1回に抑えるためには、Whereメソッドの後にToListやToArrayなどで、データの型を確定させる必要があります。

Linqの細かいことはこちらの@ITの記事を参考にしてください。
LINQの仕組み&遅延評価の正しい基礎知識
http://www.atmarkit.co.jp/fdotnet/chushin/greatblogentry_06/greatblogentry_06_01.html

マウスホイールした際に指定のコントロール内でマウスホイールが
行われたかを判定します。

 
    ''' <summary>
    ''' コントロール上にマウスカーソルが含まれるかどうかを判断する。
    ''' </summary>
    ''' <param name="control">コントロール。</param>
    ''' <returns>コントロール上にマウスカーソルが含まれるかどうか。</returns>
    ''' <remarks></remarks>
    Private Function ContainsMouseCursor(control As Control) As Boolean
‌ 
        Return control.ClientRectangle.Contains(control.PointToClient(Cursor.Position))
‌ 
    End Function
    ''' <summary>
    ''' マウスホイール動作処理
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub Detail_MouseWheel(ByVal sender As ObjectByVal e As MouseEventArgs) Handles Me.MouseWheel
‌ 
        If Not Me.ContainsMouseCursor(Me.panel1) Then
            '
            ' 範囲外でマウスホイールが行われた場合
            '
            Exit Sub
        End If
‌ 
    End Sub

EXEのアイコンを
画面Form左上のアイコンとして自動的に設定するクラスです。
 
画面ロードじに以下を呼び出す。
Me.Icon = IconCLS.GetAppSmallIcon()


以下がクラスになります。
 
‌ 
Imports System.Runtime.InteropServices
Imports System.Drawing.Icon
‌ 
''' <summary>
''' アイコンの取得クラスです。
''' </summary>
''' <remarks></remarks>
Public Class IconCLS
‌ 
‌ 
#Region "アイコン"
‌ 
‌ 
    ''' <summary>
    ''' SHGetFileInfo関数で使用する構造体
    ''' </summary>
    ''' <remarks></remarks>
    Private Structure SHFILEINFO
        Public hIcon As IntPtr
        Public iIcon As IntPtr
        Public dwAttributes As Integer
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=260)> _
        Public szDisplayName As String
        <MarshalAs(UnmanagedType.ByValTStr, SizeConst:=80)> _
        Public szTypeName As String
    End Structure
‌ 
    ' SHGetFileInfo関数で使用するフラグ
    Private Const SHGFI_ICON As Integer = &H100 ' アイコン・リソースの取得
    Private Const SHGFI_LARGEICON As Integer = &H0 ' 大きいアイコン
    Private Const SHGFI_SMALLICON As Integer = &H1 ' 小さいアイコン
‌ 
‌ 
    ''' <summary>
    '''  SHGetFileInfo関数
    ''' </summary>
    ''' <param name="pszPath"></param>
    ''' <param name="dwFileAttributes"></param>
    ''' <param name="psfi"></param>
    ''' <param name="cbFileInfo"></param>
    ''' <param name="uFlags"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Declare Ansi Function SHGetFileInfo Lib "shell32.dll" (ByVal pszPath As StringByVal dwFileAttributes As IntegerByRef psfi As SHFILEINFO, ByVal cbFileInfo As IntegerByVal uFlags As IntegerAs IntPtr
‌ 
    ''' <summary>
    ''' アイコン
    ''' </summary>
    ''' <remarks></remarks>
    Private Shared _smallIcon As Icon = Nothing
‌ 
    ''' <summary>
    ''' 現在のアセンブリのロケーションを取得します。
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Shared Function GetAssemblyLocation() As String
        Dim mainAssembly As System.Reflection.Assembly = System.Reflection.Assembly.GetEntryAssembly()
        Return mainAssembly.Location()
    End Function
‌ 
    ''' <summary>
    ''' アイコンの取得を行います。
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks>
    ''' 
    ''' 親フォームのクラスに以下の設定を行うと自動的にEXEのアイコンが
    ''' フォーム左上のアイコンになります。
    ''' また、アイコンが設定されていない場合は、WIndowsアプリデフォルトの
    ''' アイコンが設定されます。
    ''' 
    ''' Protected Overrides Sub OnLoad(ByVal e As EventArgs)
    '''     Me.Icon = IconCLS.GetAppSmallIcon()
    '''     MyBase.OnLoad(e)
    ''' End Sub
    ''' </remarks>
    Public Shared Function GetAppSmallIcon() As Drawing.Icon
        If (_smallIcon IsNot NothingThen
            Return _smallIcon
        End If
‌ 
        Dim shInfo As New SHFILEINFO()
        Dim hSuccess As IntPtr = SHGetFileInfo( _
            GetAssemblyLocation(), _
            0, _
            shInfo, _
            Marshal.SizeOf(shInfo), _
            SHGFI_ICON Or SHGFI_LARGEICON)
‌ 
        If hSuccess.Equals(IntPtr.Zero) Then
            '// アイコン取得に失敗したとき
            Return SystemIcons.Application
        End If
‌ 
        _smallIcon = Icon.FromHandle(shInfo.hIcon)
        Return _smallIcon
    End Function
‌ 
#End Region
‌ 
End Class
‌ 

↑このページのトップヘ