匿名型

LINQを弄っている。社員クラス、住所クラスを用意しそれを結びつけてみる。

  • 社員クラス
Public Class ClsSyain

    Private m_Code As Integer
    Private m_Name As String
    Private m_AddressCode As String

    Private Sub New()

    End Sub

    Public Sub New(ByVal vCode As Integer, ByVal vName As String, ByVal vAddressCode As String)

        Me.m_Code = vCode
        Me.m_Name = vName
        Me.m_AddressCode = vAddressCode

    End Sub

    Public Property Code() As Integer
        Get
            Return m_Code
        End Get
        Set(ByVal value As Integer)
            m_Code = value
        End Set
    End Property

    Public Property Name() As String
        Get
            Return m_Name
        End Get
        Set(ByVal value As String)
            m_Name = value
        End Set
    End Property

    Public Property AddressCode() As String
        Get
            Return m_AddressCode
        End Get
        Set(ByVal value As String)
            m_AddressCode = value
        End Set
    End Property

End Class
  • 住所クラス
Public Class ClsAddress

    Private m_AddressCode As String
    Private m_Address As String

    Private Sub New()

    End Sub

    Public Sub New(ByVal vAddressCode As String, ByVal vAddress As String)

        Me.m_AddressCode = vAddressCode
        Me.m_Address = vAddress

    End Sub

    Public Property AddressCode() As String
        Get
            Return m_AddressCode
        End Get
        Set(ByVal value As String)
            m_AddressCode = value
        End Set
    End Property

    Public Property Address() As String
        Get
            Return m_Address
        End Get
        Set(ByVal value As String)
            m_Address = value
        End Set
    End Property

End Class
  • 結びつける処理
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    Dim SyainArry As New System.Collections.Generic.List(Of ClsSyain)
    SyainArry.Add(New ClsSyain(3, "社員3", "001"))
    SyainArry.Add(New ClsSyain(5, "社員5", "003"))
    SyainArry.Add(New ClsSyain(4, "社員4", "001"))
    SyainArry.Add(New ClsSyain(2, "社員2", "002"))
    SyainArry.Add(New ClsSyain(1, "社員1", "001"))

    Dim AddresArry As New System.Collections.Generic.List(Of ClsAddress)
    AddresArry.Add(New ClsAddress("001", "住所1"))
    AddresArry.Add(New ClsAddress("002", "住所2"))
    AddresArry.Add(New ClsAddress("003", "住所3"))

    Dim f = From syain In SyainArry, jyusyo In AddresArry _
            Where syain.AddressCode = jyusyo.AddressCode _
            Order By syain.Code _
            Select syain.Name, jyusyo.Address

    For Each x In f
        Console.WriteLine(x.Name & ":" & x.Address)
    Next

End Sub

動いた。なんと素晴らしい!!一件落着・・・・いや、終わっていない。

Dim f = From syain In SyainArry, jyusyo...

この行で宣言している変数f。こいつは何だ。いきなり出てきて直後For Eachに回される。なんとも軽い存在だが・・・ヒントをみて見ると、

Dim f As System.Collections.Generic.IEnumerable(Of <匿名型>)

さらに変数xは、

Dim x As <匿名型>

匿名型・・・初耳だ。初顔合わせだ。ヘルプにはAnonymousTypeとして記述されている。自前で宣言もできる。

Dim a1 As Integer = 55
Dim Anon = New With {.Bango = a1, .Name = "TestVal"}
Console.WriteLine(Anon.Bango)
Console.WriteLine(Anon.Name)

なんじゃこりゃ・・・柔らかいがカチッとしている。憎めない存在だ。