다음을 통해 공유


프로젝션 작업(Visual Basic)

프로젝션은 개체를 나중에 사용할 속성으로만 구성되는 새 형식으로 변환하는 작업을 나타냅니다. 프로젝션을 사용하여 각 개체에서 빌드된 새 형식을 생성할 수 있습니다. 속성을 프로젝션하고 수학적 함수를 수행할 수 있습니다. 원래 개체를 변경하지 않고 프로젝스할 수도 있습니다.

프로젝션을 수행하는 표준 쿼리 연산자 메서드는 다음 섹션에 나열됩니다.

메서드

메서드 이름 설명 Visual Basic 쿼리 식 구문 더 많은 정보
선택 변환 함수를 기반으로 하는 값을 프로젝트합니다. Select Enumerable.Select

Queryable.Select
SelectMany 변환 함수를 기반으로 하는 값 시퀀스를 프로젝트한 다음 하나의 시퀀스로 평면화합니다. 여러 From 절을 사용하세요. Enumerable.SelectMany

Queryable.SelectMany
압축 파일 지정된 시퀀스 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() 보여 줍니다.

Select()의 동작을 보여 주는 그래픽

이 그림에서는 배열의 중간 시퀀스를 각 중간 배열의 각 값을 포함하는 하나의 최종 결과 값으로 연결하는 방법을 SelectMany() 보여 줍니다.

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

참고하십시오