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 Dizilimi Daha Fazla Bilgi
Seç Dönüştürme işlevi üzerine kurulu değerleri projeler. Select Enumerable.Select

Queryable.Select
SelectMany Bir dönüştürme işlevine dayalı değer dizilerini yansıtır ve ardından bunları tek bir dizinin içine birleştirir. Birden fazla From yan tümce kullan Enumerable.SelectMany

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

Sorgu İfade Sözdizimi Örnekleri

Seç

Aşağıdaki örnek, Select tümcesini kullanarak dize listesindeki her dizeden ilk harfi projeksiyon yapmak için kullanır.

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 Select() hem de SelectMany() öğ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. Transform fonksiyonu, SelectMany() bağımsız değişken olarak geçildiğinde, her kaynak değer için numaralandırılabilir bir değer dizisi döndürmelidir. 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.

Select() eylemini gösteren grafik

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.

SelectMany() eylemini gösteren grafik.

Kod Örneği

Aşağıdaki örnek, Select() ve SelectMany()'in davranışlarını 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 bakınız