【VB.NET】LINQの使い方(GroupBy, DistinctBy, Join)

GroupBy:シーケンスの要素をグループ化する

VB
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Dim dt As New DataTable
        With dt
            .Columns.Add("OrderNo", GetType(Integer)) '注文番号
            .Columns.Add("ProductCode", GetType(String)) '商品コード
            .Rows.Add(1, "A001")
            .Rows.Add(2, "A002")
            .Rows.Add(3, "A003")
            .Rows.Add(4, "A003")
            .Rows.Add(5, "A005")
        End With

        'ProductCodeでグループ化する
        For Each item In dt.AsEnumerable.GroupBy(Function(dr) dr("ProductCode"))
            Debug.WriteLine(item.Key)
        Next

        '出力結果----
        'A001
        'A002
        'A003
        'A005
                                    
    End Sub

DistinctBy:シーケンスの重複を除外する

VB
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Dim dt As New DataTable
        With dt
            .Columns.Add("OrderNo", GetType(Integer)) '注文番号
            .Columns.Add("ProductCode", GetType(String)) '商品コード
            .Rows.Add(1, "A001")
            .Rows.Add(2, "A002")
            .Rows.Add(3, "A002")
            .Rows.Add(4, "A003")
        End With

        '重複を除外したコードのリストを取得する
        Dim list = dt.AsEnumerable.DistinctBy(Function(dr) dr("ProductCode")).
                                   Select(Function(dr) dr("ProductCode")).
                                   ToList
        '出力結果----
        'A001
        'A002
        'A003
                                    
    End Sub

Join:2つのシーケンスを指定したキーで結合する

VB
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Dim dt1 As New DataTable
        With dt1
            .Columns.Add("OrderNo", GetType(Integer)) '注文番号
            .Columns.Add("ProductCode", GetType(String)) '商品コード
            .Rows.Add(1, "A001")
            .Rows.Add(2, "A002")
            .Rows.Add(3, "A003")
        End With
        
        Dim dt2 As New DataTable
        With dt2
            .Columns.Add("ProductCode", GetType(String)) '商品コード
            .Columns.Add("ProductName", GetType(String)) '商品名
            .Rows.Add("A001", "パソコン")
            .Rows.Add("A002", "冷蔵庫")
            .Rows.Add("A003", "洗濯機")
        End With

        'ProductCodeをキーとしてdt1, dt2を結合した結果をlistに格納する
        Dim list = dt1.AsEnumerable.Join(dt2.AsEnumerable,
                          Function(order) order.Field(Of String)("ProductCode"),
                          Function(product) product.Field(Of String)("ProductCode"),
                          Function(order, product) New With {
                           .OrderNo = order.Field(Of Integer)("OrderNo"),
                           .ProductName = product.Field(Of String)("ProductName")
                              }).ToList
        '出力結果----
        'OrderNo=1, ProductName="パソコン"
        'OrderNo=2, ProductName="冷蔵庫"
        'OrderNo=3, ProductName="洗濯機"
        
    End Sub

コメント

タイトルとURLをコピーしました