2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[LINQ VB.NET] ToLookup() GroupBy() の違い。

Posted at

LINQ の拡張メソッドに ToLookup() というものがあります。グループ化するものらしいです。ネット検索すると C# のサンプルばかりなので VB.NET のサンプルを作ってみますよ。

ToLookup() を使った VB.NET のサンプル

早速サンプルです。

ToLookup()サンプル
' サンプルのためのデータを作成する
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() というメソッドもありますよ。上記サンプルコードの「キモ」の部分だけ書きます。

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() は即時評価。違いは こちら を参照。たとえば二番目のサンプルで結果を表示するループ処理を二回行うとグループ化処理も二回行われてしまうということですね。

グループ化した結果をどのように使うかによる、と。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?