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.
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.
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.
- System.Linq
- Standart Sorgu İşleçlerine Genel Bakış (Visual Basic)
- Select Yan Tümcesi
- Nasıl yapılır: Verileri Birleştirmelerle Birleştirme
- Nasıl yapılır: Birden Çok Kaynaktan Nesne Koleksiyonlarını Doldurma (LINQ) (Visual Basic)
- Nasıl yapılır: Bir LINQ Sorgu Sonucunu Belirli Bir Tür Olarak Döndürme
- Nasıl yapılır: Grupları Kullanarak Bir Dosyayı Birçok Dosyaya Bölme (LINQ) (Visual Basic)