Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Проекция относится к операции преобразования объекта в новую форму, которая часто состоит только из тех свойств, которые впоследствии будут использоваться. С помощью проекции можно создать новый тип, созданный из каждого объекта. Вы можете проецить свойство и выполнить математическую функцию. Вы также можете проецировать исходный объект без изменений.
Стандартные методы оператора запроса, выполняющие проекцию, перечислены в следующем разделе.
Методы
Имя метода | Описание | Синтаксис выражения запроса Visual Basic | Дополнительная информация |
---|---|---|---|
Выберите | Проекции значений, основанные на функции преобразования. | Select |
Enumerable.Select Queryable.Select |
SelectMany | Проецирует последовательности значений, основанных на функции преобразования, и затем объединяет их в одну последовательность. | Используйте несколько 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()
создает одно значение результата для каждого исходного значения. Таким образом, общий результат представляет собой коллекцию, которая имеет то же количество элементов, что и исходная коллекция. В отличие от этого, SelectMany()
дает общий результат, содержащий объединенные подколлекции из каждого исходного значения. Функция преобразования, передаваемая в качестве аргумента SelectMany()
, должна возвращать перечисленную последовательность значений для каждого исходного значения. Затем эти перечисленные последовательности объединяются путем SelectMany()
создания одной большой последовательности.
На следующих двух иллюстрациях показано концептуальное различие между действиями этих двух методов. В каждом случае предположим, что функция селектора (преобразования) выбирает массив цветов из каждого исходного значения.
На этом рисунке показано, как Select()
возвращает коллекцию с таким же количеством элементов, что и исходная коллекция.
На этом рисунке показано, как 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
См. также
- System.Linq
- Общие сведения о стандартных операторах запроса (Visual Basic)
- Выражение select
- Как объединить данные с помощью соединений
- Практическое руководство. Заполнение коллекций объектов из нескольких источников (LINQ) (Visual Basic)
- Практическое руководство. Возврат результата запроса LINQ в качестве определенного типа
- Практическое руководство. Разделение файла на множество файлов с помощью групп (LINQ) (Visual Basic)