Aracılığıyla paylaş


Projeksiyon İşlemleri (Visual Basic)

Projeksiyon, bir nesneyi genellikle yalnızca daha sonra kullanılacak özelliklerden oluşan yeni bir forma dönüştürme işlemini ifade eder. Projeksiyonu kullanarak, her nesneden oluşturulan yeni bir tür oluşturabilirsiniz. Bir özelliği yansıtabilir ve üzerinde matematiksel bir işlev gerçekleştirebilirsiniz. Özgün nesneyi değiştirmeden de yansıtabilirsiniz.

Projeksiyon gerçekleştiren standart sorgu işleci yöntemleri aşağıdaki bölümde listelenmiştir.

Yöntemler

Yöntem Adı Açıklama Visual Basic Sorgu İfadesi Söz Dizimi Daha Fazla Bilgi
Seç Bir dönüştürme işlevini temel alan değerleri projeler. Select Enumerable.Select

Queryable.Select
Selectmany Bir dönüştürme işlevini temel alan değer dizilerini projeler ve sonra bunları tek bir sırayla düzleştirir. Birden çok From yan tümce kullanma Enumerable.SelectMany

Queryable.SelectMany
Posta Kodu Belirtilen 2-3 diziden öğeler içeren bir demet dizisi oluşturur. Uygulanamaz. Enumerable.Zip
Queryable.Zip

Sorgu İfadesi Söz Dizimi Örnekleri

Seç

Aşağıdaki örnek, dize listesindeki her dizeden ilk harfi yansıtmak için yan tümcesini kullanır 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

Aşağıdaki örnek, her dizedeki her sözcüğü bir dize listesinde yansıtmak için birden çok From yan tümce kullanır.

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 ve SelectMany karşılaştırması

hem hem SelectMany() de Select() öğesinin çalışması, kaynak değerlerden bir sonuç değeri (veya değerler) üretmektir. Select() her kaynak değer için bir sonuç değeri üretir. Bu nedenle genel sonuç, kaynak koleksiyonla aynı sayıda öğeye sahip bir koleksiyondur. Buna karşılık, SelectMany() her kaynak değerinden birleştirilmiş alt koleksiyonlar içeren tek bir genel sonuç üretir. bağımsız değişken SelectMany() olarak geçirilen transform işlevinin her kaynak değer için numaralandırılabilir bir değer dizisi döndürmesi gerekir. Bu numaralandırılabilir diziler daha sonra tarafından SelectMany() birleştirilir ve büyük bir dizi oluşturulur.

Aşağıdaki iki çizimde, bu iki yöntemin eylemleri arasındaki kavramsal fark gösterilmektedir. Her durumda selector (transform) işlevinin her kaynak değerden çiçek dizisini seçtiğini varsayalım.

Bu çizimde, kaynak koleksiyonla aynı sayıda öğeye sahip bir koleksiyonun nasıl Select() döndürüldüğü gösterilmektedir.

Graphic that shows the action of Select()

Bu çizimde, dizilerin ara dizisinin her ara dizideki her değeri içeren son bir sonuç değeriyle nasıl SelectMany() birleştirildiği gösterilmektedir.

Graphic showing the action of SelectMany().

Kod Örneği

Aşağıdaki örnek ve SelectMany()davranışını Select() karşılaştırır. Kod, kaynak koleksiyondaki her çiçek adı listesinden öğeleri alarak bir "buket" çiçek oluşturur. Bu örnekte, dönüştürme işlevinin Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,TResult>) kullandığı "tek değer", bir değer koleksiyonudur. Bu, her alt dizideki her dizeyi listelemek için ek For Each döngü gerektirir.

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

Ayrıca bkz.