Bagikan melalui


Operasi Proyeksi (Visual Basic)

Proyeksi mengacu pada operasi mengubah objek menjadi bentuk baru yang sering hanya terdiri dari properti yang kemudian akan digunakan. Dengan menggunakan proyeksi, Anda dapat membuat jenis baru yang dibangun dari setiap objek. Anda dapat memproyeksikan properti dan melakukan fungsi matematika di atasnya. Anda juga dapat memproyekan objek asli tanpa mengubahnya.

Metode operator kueri standar yang melakukan proyeksi tercantum di bagian berikut.

Metode

Nama Metode Deskripsi Sintaks Ekspresi Kueri Visual Basic Informasi Selengkapnya
Pilih Memproyeksikan nilai yang didasarkan pada fungsi transformasi. Select Enumerable.Select

Queryable.Select
Pilih Banyak Memproyeksikan urutan nilai yang didasarkan pada fungsi transformasi dan kemudian meratakannya menjadi satu urutan. Menggunakan beberapa From klausa Enumerable.SelectMany

Queryable.SelectMany
Zip Menghasilkan serangkaian tuple dengan elemen-elemen dari 2-3 urutan yang ditentukan. Tidak dapat diterapkan. Enumerable.Zip
Queryable.Zip

Contoh Sintaks Ekspresi Kueri

Pilih

Contoh berikut menggunakan klausul Select untuk memproyeksikan huruf pertama dari setiap string dalam daftar string.

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

Pilih Banyak

Contoh berikut menggunakan beberapa From klausa untuk memproyeksikan setiap kata dari setiap string dalam daftar string.

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

Pilih versus SelectMany

Pekerjaan keduanya Select() dan SelectMany() adalah menghasilkan nilai hasil (atau nilai) dari nilai sumber. Select() menghasilkan satu nilai hasil untuk setiap nilai sumber. Oleh karena itu, hasil keseluruhan adalah koleksi yang memiliki jumlah elemen yang sama dengan koleksi sumber. Sebaliknya, SelectMany() menghasilkan satu hasil keseluruhan yang berisi sub-koleksi yang digabungkan dari setiap nilai sumber. Fungsi transformasi yang diteruskan sebagai argumen ke SelectMany() harus mengembalikan urutan nilai yang enumerable untuk setiap nilai sumber. Urutan yang dapat dijumlahkan ini kemudian digabungkan dengan SelectMany() untuk membuat satu urutan besar.

Dua ilustrasi berikut menunjukkan perbedaan konseptual antara tindakan kedua metode ini. Dalam setiap kasus, asumsikan bahwa fungsi pemilih (transform) memilih array bunga dari setiap nilai sumber.

Ilustrasi ini menggambarkan bagaimana Select() mengembalikan koleksi yang memiliki jumlah elemen yang sama dengan kumpulan sumber.

Grafik yang memperlihatkan tindakan Pilih()

Ilustrasi ini menggambarkan bagaimana SelectMany() menggabungkan urutan perantara array menjadi satu nilai hasil akhir yang berisi setiap nilai dari setiap array perantara.

Grafik memperlihatkan tindakan SelectMany().

Contoh Kode

Contoh berikut membandingkan perilaku Select() dan SelectMany(). Kode ini membuat "buket" bunga dengan mengambil item dari setiap daftar nama bunga dalam koleksi sumber. Dalam contoh ini, "nilai tunggal" yang digunakan fungsi Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,TResult>) transformasi adalah kumpulan nilai itu sendiri. Ini memerlukan perulangan tambahan For Each untuk menghitung setiap string di setiap suburutan.

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

Lihat juga