次の方法で共有


プロジェクション操作 (Visual Basic)

プロジェクションとは、オブジェクトを新しい形式に変換する操作を指します。これは、多くの場合、後で使用されるプロパティのみで構成されます。 プロジェクションを使用すると、各オブジェクトから構築された新しい型を構築できます。 プロパティを投影し、それに対して数学関数を実行できます。 元のオブジェクトを変更せずに投影することもできます。

プロジェクションを実行する標準のクエリ演算子メソッドを次のセクションに示します。

メソッド

メソッド名 説明 Visual Basic のクエリ式の構文 詳細情報
選択する 変換関数に基づく値をプロジェクト化します。 Select Enumerable.Select

Queryable.Select
SelectMany 変換関数に基づく値のシーケンスをプロジェクトし、それらを 1 つのシーケンスにフラット化します。 複数の From 句を使用する Enumerable.SelectMany

Queryable.SelectMany
ZIPファイル 指定した 2 から 3 個のシーケンスの要素を持つタプルのシーケンスを生成します。 適用されません。 Enumerable.Zip
Queryable.Zip

クエリ式の構文の例

選択する

次の例では、 Select 句を使用して、各文字列の最初の文字を文字列の一覧に投影します。

Dim words = New List(Of String) From {"an", "apple", "a", "day"}

Dim query = From word In words
            Select word.Substring(0, 1)

Dim sb As New System.Text.StringBuilder()
For Each letter As String In query
    sb.AppendLine(letter)
Next

' Display the output.
MsgBox(sb.ToString())

' This code produces the following output:

' a
' a
' a
' d

SelectMany

次の例では、複数の From 句を使用して、各文字列の各単語を文字列の一覧に投影します。

Dim phrases = New List(Of String) From {"an apple a day", "the quick brown fox"}

Dim query = From phrase In phrases
            From word In phrase.Split(" "c)
            Select word

Dim sb As New System.Text.StringBuilder()
For Each str As String In query
    sb.AppendLine(str)
Next

' Display the output.
MsgBox(sb.ToString())

' This code produces the following output:

' an
' apple
' a
' day
' the
' quick
' brown
' fox

Select と SelectMany の比較

Select()SelectMany()の両方の作業は、ソース値から結果値 (または値) を生成することです。 Select() では、ソース値ごとに 1 つの結果値が生成されます。 したがって、全体的な結果は、ソース コレクションと同じ数の要素を持つコレクションになります。 これに対し、 SelectMany() では、各ソース値から連結されたサブコレクションを含む 1 つの全体的な結果が生成されます。 SelectMany()の引数として渡される変換関数は、ソース値ごとに列挙可能な値のシーケンスを返す必要があります。 これらの列挙可能なシーケンスは、 SelectMany() で連結され、1 つの大きなシーケンスが作成されます。

次の 2 つの図は、これら 2 つのメソッドのアクションの概念上の違いを示しています。 いずれの場合も、セレクター (変換) 関数が各ソース値から花の配列を選択すると仮定します。

次の図は、ソース コレクションと同じ数の要素を持つコレクションを Select() が返す方法を示しています。

Select() のアクションを示す図

この図は、 SelectMany() 配列の中間シーケンスを連結して、各中間配列の各値を含む最終的な結果値を 1 つにまとめる方法を示しています。

SelectMany() のアクションを示す図。

コード例

次の例では、 Select()SelectMany()の動作を比較します。 このコードでは、ソース コレクション内の花の名前の各リストから項目を取得して、花の "ブーケ" を作成します。 この例では、変換関数 Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,TResult>) 使用する "単一値" 自体が値のコレクションです。 これには、各サブシーケンス内の各文字列を列挙するために、追加の For Each ループが必要です。

Class Bouquet
    Public Flowers As List(Of String)
End Class

Sub SelectVsSelectMany()
    Dim bouquets = New List(Of Bouquet) From {
        New Bouquet With {.Flowers = New List(Of String)(New String() {"sunflower", "daisy", "daffodil", "larkspur"})},
        New Bouquet With {.Flowers = New List(Of String)(New String() {"tulip", "rose", "orchid"})},
        New Bouquet With {.Flowers = New List(Of String)(New String() {"gladiolis", "lily", "snapdragon", "aster", "protea"})},
        New Bouquet With {.Flowers = New List(Of String)(New String() {"larkspur", "lilac", "iris", "dahlia"})}}

    Dim output As New System.Text.StringBuilder

    ' Select()
    Dim query1 = bouquets.Select(Function(b) b.Flowers)

    output.AppendLine("Using Select():")
    For Each flowerList In query1
        For Each str As String In flowerList
            output.AppendLine(str)
        Next
    Next

    ' SelectMany()
    Dim query2 = bouquets.SelectMany(Function(b) b.Flowers)

    output.AppendLine(vbCrLf & "Using SelectMany():")
    For Each str As String In query2
        output.AppendLine(str)
    Next

    ' Display the output
    MsgBox(output.ToString())

    ' This code produces the following output:
    '
    ' Using Select():
    ' sunflower
    ' daisy
    ' daffodil
    ' larkspur
    ' tulip
    ' rose
    ' orchid
    ' gladiolis
    ' lily
    ' snapdragon
    ' aster
    ' protea
    ' larkspur
    ' lilac
    ' iris
    ' dahlia

    ' Using SelectMany()
    ' sunflower
    ' daisy
    ' daffodil
    ' larkspur
    ' tulip
    ' rose
    ' orchid
    ' gladiolis
    ' lily
    ' snapdragon
    ' aster
    ' protea
    ' larkspur
    ' lilac
    ' iris
    ' dahlia

End Sub

こちらも参照ください