Aggregate 절(Visual Basic)

컬렉션에 하나 이상의 집계 함수를 적용합니다.

구문

Aggregate element [As type] In collection _  
  [, element2 [As type2] In collection2, [...]]  
  [ clause ]  
  Into expressionList  

부분

용어 정의
element 필수 요소. 컬렉션의 요소를 반복하는 데 사용되는 변수입니다.
type 선택 사항입니다. element의 형식입니다. 형식을 지정하지 않으면 형식 element 이 .에서 collection유추됩니다.
collection 필수 사항입니다. 작동할 컬렉션을 참조합니다.
clause 선택 사항입니다. 절과 같은 하나 이상의 쿼리 절을 Where 사용하여 집계 절 또는 절을 적용하도록 쿼리 결과를 구체화합니다.
expressionList 필수 사항입니다. 컬렉션에 적용할 집계 함수를 식별하는 하나 이상의 쉼표로 구분된 식입니다. 집계 함수에 별칭을 적용하여 쿼리 결과의 멤버 이름을 지정할 수 있습니다. 별칭이 제공되지 않으면 집계 함수의 이름이 사용됩니다. 예를 들어 이 항목의 뒷부분에 있는 집계 함수에 대한 섹션을 참조하세요.

설명

절을 Aggregate 사용하여 쿼리에 집계 함수를 포함할 수 있습니다. 집계 함수는 값 집합에 대해 검사 및 계산을 수행하고 단일 값을 반환합니다. 쿼리 결과 형식의 멤버를 사용하여 계산된 값에 액세스할 수 있습니다. 사용할 수 있는 표준 집계 함수는 All, Any, Average, CountLongCount, MaxMinSum 함수입니다. 이러한 함수는 SQL 집계에 익숙한 개발자에게 익숙합니다. 이 항목의 다음 섹션에 설명되어 있습니다.

집계 함수의 결과는 쿼리 결과 형식의 필드로 쿼리 결과에 포함됩니다. 집계 함수 결과에 대한 별칭을 제공하여 집계 값을 보유할 쿼리 결과 형식의 멤버 이름을 지정할 수 있습니다. 별칭이 제공되지 않으면 집계 함수의 이름이 사용됩니다.

절은 Aggregate 쿼리를 시작하거나 쿼리에 추가 절로 포함될 수 있습니다. 절이 Aggregate 쿼리를 시작하는 경우 결과는 절에 지정된 Into 집계 함수의 결과인 단일 값입니다. 절에 Into 둘 이상의 집계 함수가 지정된 경우 쿼리는 별도의 속성이 있는 단일 형식을 반환하여 절에 있는 Into 각 집계 함수의 결과를 참조합니다. 절이 쿼리에 Aggregate 추가 절로 포함된 경우 쿼리 컬렉션에 반환된 형식에는 절에 있는 각 집계 함수의 결과를 참조하는 별도의 속성이 Into 있습니다.

집계 함수

다음은 절과 함께 사용할 수 있는 표준 집계 함수입니다 Aggregate .

모두

true 컬렉션의 모든 요소가 지정된 조건을 충족하는지를 반환하고, 그렇지 않으면 반환합니다false. 다음은 이에 대한 예입니다.

Dim customerList1 = Aggregate order In orders
                    Into AllOrdersOver100 = All(order.Total >= 100)

모두

true 컬렉션의 요소가 지정된 조건을 충족하는지를 반환하고, 그렇지 않으면 반환합니다false. 다음은 이에 대한 예입니다.

Dim customerList2 = From cust In customers
                    Aggregate order In cust.Orders
                    Into AnyOrderOver500 = Any(order.Total >= 500)

평균

컬렉션에 있는 모든 요소의 평균을 계산하거나 컬렉션의 모든 요소에 대해 제공된 식을 계산합니다. 다음은 이에 대한 예입니다.

Dim customerOrderAverage = Aggregate order In orders
                           Into Average(order.Total)

개수

컬렉션의 요소 수를 계산합니다. 조건을 충족하는 컬렉션의 요소 수만 계산하는 선택적 Boolean 식을 제공할 수 있습니다. 다음은 이에 대한 예입니다.

Dim customerOrderAfter1996 = From cust In customers
                             Aggregate order In cust.Orders
                             Into Count(order.OrderDate > #12/31/1996#)

그룹

또는 Group Join 절의 Group By 결과로 그룹화된 쿼리 결과를 참조합니다. 함수는 Group or Group Join 절의 IntoGroup By 절에서만 유효합니다. 자세한 내용과 예제는 Group By 절그룹 조인 절을 참조하세요.

LongCount

컬렉션의 요소 수를 계산합니다. 조건을 충족하는 컬렉션의 요소 수만 계산하는 선택적 Boolean 식을 제공할 수 있습니다. 결과를 .로 반환합니다 Long. 예를 들어 집계 함수를 Count 참조하세요.

최대값

컬렉션의 최대값을 계산하거나 컬렉션의 모든 요소에 대해 제공된 식을 계산합니다. 다음은 이에 대한 예입니다.

Dim customerMaxOrder = Aggregate order In orders
                       Into MaxOrder = Max(order.Total)

최소값

컬렉션에서 최소값을 계산하거나 컬렉션의 모든 요소에 대해 제공된 식을 계산합니다. 다음은 이에 대한 예입니다.

Dim customerMinOrder = From cust In customers
                       Aggregate order In cust.Orders
                       Into MinOrder = Min(order.Total)

합계

컬렉션에 있는 모든 요소의 합계를 계산하거나 컬렉션의 모든 요소에 대해 제공된 식을 계산합니다. 다음은 이에 대한 예입니다.

Dim customerTotals = From cust In customers
                     Aggregate order In cust.Orders
                     Into Sum(order.Total)

예제

다음 예제에서는 절을 사용하여 Aggregate 쿼리 결과에 집계 함수를 적용하는 방법을 보여 줍니다.

Public Sub AggregateSample()
    Dim customers = GetCustomerList()

    Dim customerOrderTotal =
        From cust In customers
        Aggregate order In cust.Orders
        Into Sum(order.Total), MaxOrder = Max(order.Total),
        MinOrder = Min(order.Total), Avg = Average(order.Total)

    For Each customer In customerOrderTotal
        Console.WriteLine(customer.cust.CompanyName & vbCrLf &
                         vbTab & "Sum = " & customer.Sum & vbCrLf &
                         vbTab & "Min = " & customer.MinOrder & vbCrLf &
                         vbTab & "Max = " & customer.MaxOrder & vbCrLf &
                         vbTab & "Avg = " & customer.Avg.ToString("#.##"))
    Next
End Sub

User-Defined 집계 함수 만들기

형식에 확장 메서드를 추가하여 쿼리 식에 사용자 지정 집계 함수를 포함할 IEnumerable<T> 수 있습니다. 그런 다음 사용자 지정 메서드는 집계 함수를 참조한 열거 가능한 컬렉션에서 계산 또는 작업을 수행할 수 있습니다. 확장 메서드에 대한 자세한 내용은 확장 메서드를 참조하세요.

예를 들어 다음 예제에서는 숫자 컬렉션의 중앙값을 계산하는 사용자 지정 집계 함수를 보여 줍니다. 확장 메서드에는 두 개의 오버로드가 Median 있습니다. 첫 번째 오버로드는 형식 IEnumerable(Of Double)의 컬렉션을 입력으로 허용합니다. 형식DoubleMedian 쿼리 필드에 대해 집계 함수가 호출되면 이 메서드가 호출됩니다. 메서드의 Median 두 번째 오버로드는 제네릭 형식을 전달할 수 있습니다. 메서드의 Median 제네릭 오버로드는 람다 식을 참조 Func(Of T, Double) 하는 두 번째 매개 변수를 사용하여 형식의 값을 해당 형식 값 Double으로 프로젝션합니다(컬렉션에서). 그런 다음, 메서드의 다른 오버로드에 중앙값 계산을 위임합니다 Median . 람다 식에 대한 자세한 내용은 람다 식을 참조하세요.

Imports System.Runtime.CompilerServices

Module UserDefinedAggregates

    ' Calculate the median value for a collection of type Double.
    <Extension()>
    Function Median(ByVal values As IEnumerable(Of Double)) As Double
        If values.Count = 0 Then
            Throw New InvalidOperationException("Cannot compute median for an empty set.")
        End If

        Dim sortedList = From number In values
                         Order By number

        Dim medianValue As Double

        Dim itemIndex = CInt(Int(sortedList.Count / 2))

        If sortedList.Count Mod 2 = 0 Then
            ' Even number of items in list.
            medianValue = ((sortedList(itemIndex) + sortedList(itemIndex - 1)) / 2)
        Else
            ' Odd number of items in list.
            medianValue = sortedList(itemIndex)
        End If

        Return medianValue
    End Function

    ' "Cast" the collection of generic items as type Double and call the 
    ' Median() method to calculate the median value.
    <Extension()>
    Function Median(Of T)(ByVal values As IEnumerable(Of T),
                          ByVal selector As Func(Of T, Double)) As Double
        Return (From element In values Select selector(element)).Median()
    End Function

End Module

다음 예제에서는 형식 컬렉션 및 형식Integer의 컬렉션에서 집계 함수를 호출 Median 하는 샘플 쿼리를 Double보여 줍니다. 형식 컬렉션에서 Median 집계 함수를 호출하는 쿼리는 형식 DoubleMedian 컬렉션을 입력으로 수락하는 메서드의 Double오버로드를 호출합니다. 형식 Integer 컬렉션에서 Median 집계 함수를 호출하는 쿼리는 메서드의 제네릭 오버로드를 Median 호출합니다.

Module Module1

    Sub Main()
        Dim numbers1 = {1, 2, 3, 4, 5}

        Dim query1 = Aggregate num In numbers1 Into Median(num)

        Console.WriteLine("Median = " & query1)

        Dim numbers2 = {1.9, 2, 8, 4, 5.7, 6, 7.2, 0}

        Dim query2 = Aggregate num In numbers2 Into Median()

        Console.WriteLine("Median = " & query2)
    End Sub

End Module

추가 정보