LINQ の拡張メソッドに ToLookup() というものがあります。グループ化するものらしいです。ネット検索すると C# のサンプルばかりなので VB.NET のサンプルを作ってみますよ。
ToLookup() を使った VB.NET のサンプル
早速サンプルです。
' サンプルのためのデータを作成する
Dim lst As New List(Of Object)
With lst
.Add(New With {.Type = "Fruits", .Name = "Apple"})
.Add(New With {.Type = "Fruits", .Name = "Banana"})
.Add(New With {.Type = "Fruits", .Name = "Citrus"})
.Add(New With {.Type = "Fruits", .Name = "Dorian"})
.Add(New With {.Type = "Vegitables", .Name = "Avocado"})
.Add(New With {.Type = "Vegitables", .Name = "Broccoli"})
.Add(New With {.Type = "Vegitables", .Name = "Carrot"})
.Add(New With {.Type = "Vegitables", .Name = "Daikon"})
.Add(New With {.Type = "Vegitables", .Name = "Endive"})
.Add(New With {.Type = "Flowers", .Name = "Anemone"})
.Add(New With {.Type = "Flowers", .Name = "Begonia"})
.Add(New With {.Type = "Flowers", .Name = "Clematis"})
.Add(New With {.Type = "Flowers", .Name = "Dahlia"})
.Add(New With {.Type = "Flowers", .Name = "Echinacea"})
End With
' サンプルコードのキモ
Dim olinq = lst.ToLookup(Function(o) o.Type)
' 結果を表示する
For Each o As Object In olinq
System.Diagnostics.Debug.Print("# " & o.key)
For Each nm As Object In o
System.Diagnostics.Debug.Print(" " & nm.Name)
Next
Next
同じ結果になる処理を GroupBy() で書いてみる
一方、グループ化というと GroupBy() というメソッドもありますよ。上記サンプルコードの「キモ」の部分だけ書きます。
Dim olinq = lst.GroupBy(Function(o) o.Type)
まったく同じ結果になりましたよ。何のために二つのメソッドがあるんでしょう。
使い分け
上のサンプルはいずれも LINQ to Object ですね。LINQ to Object に対する実行ではあまり差はないみたいです。LINQ to SQL で実行すると動作が違う。
ToLookup() は全部のデータを持ってきて走査、GroupBy() はデータベースに「グループ化して結果を返してね」とお願いして結果だけを返してもらう、という違いがあるということだと思います(参考)。LINQ to SQL で ToLookup() を使って、もしデータが 10 億件もあったりしたら全部持ってきてたいへんなことになると。
評価の差
そのほかには GroupBy() は遅延評価、ToLookup() は即時評価。違いは こちら を参照。たとえば二番目のサンプルで結果を表示するループ処理を二回行うとグループ化処理も二回行われてしまうということですね。
グループ化した結果をどのように使うかによる、と。