ホーム > プログラミング, Visual Basic > VB.NETで複数項目のグルーピングを行う時はKeyキーワードを

VB.NETで複数項目のグルーピングを行う時はKeyキーワードを


久々なのですっかり忘れていましたが、VB.NETの匿名型はC#とちょっと違うんですよね。

LINQのGroupByなんかで複数キーを設定する場合は、匿名型を利用するわけですが匿名型の比較の部分でVB.NETは少し癖が有ります。

    複数キーのグルーピング

例えば、こんなコードがあるとして、SubKey1とSubKey2でグルーピングされることを期待しますが、

Sub Main()
    Dim source1 = {
        New With {.Id = 1, .SubKey1 = "a", .SubKey2 = "1"},
        New With {.Id = 2, .SubKey1 = "a", .SubKey2 = "1"},
        New With {.Id = 3, .SubKey1 = "a", .SubKey2 = "2"},
        New With {.Id = 4, .SubKey1 = "a", .SubKey2 = "3"},
        New With {.Id = 5, .SubKey1 = "b", .SubKey2 = "1"},
        New With {.Id = 6, .SubKey1 = "b", .SubKey2 = "1"},
        New With {.Id = 7, .SubKey1 = "b", .SubKey2 = "1"}
    }
    Dim group1 = source1.GroupBy(Function(s) New With {s.SubKey1, s.SubKey2})
    For Each g In group1
        Console.WriteLine("{0},{1}={2}件", g.Key.SubKey1, g.Key.SubKey2, g.Count())
    Next
End Sub

結果はこうなります。グルーピングされていませんね。

a,1=1件

a,1=1件

a,2=1件

a,3=1件

b,1=1件

b,1=1件

b,1=1件

比較項目にKeyキーワードをつけると

匿名型で比較をする場合はKeyキーワードを付けてあげましょう。

Dim group1 = source1.GroupBy(Function(s) New With {Key s.SubKey1, Key s.SubKey2})
For Each g In group1
    Console.WriteLine("{0},{1}={2}件", g.Key.SubKey1, g.Key.SubKey2, g.Count())
 Next

グルーピングされました。

a,1=2件

a,2=1件

a,3=1件

b,1=3件

広告
カテゴリー:プログラミング, Visual Basic タグ:
  1. まだコメントはありません。
  1. No trackbacks yet.

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。