Предложение 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, CountAverage, , LongCountMaxа SumMinтакже функции. Эти функции знакомы разработчикам, знакомым с агрегатами в 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)

Count

Подсчитывает количество элементов в коллекции. Можно указать необязательное Boolean выражение для подсчета только количества элементов в коллекции, удовлетворяющих условию. Ниже приведен пример:

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

Групповой

Ссылается на результаты запроса, сгруппированные в результате Group By предложения или Group Join предложения. Функция действительна Group только в Into предложении или Group Join предложенииGroup By. Дополнительные сведения и примеры см. в предложении group by иgroup Join.

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)

Sum

Вычисляет сумму всех элементов в коллекции или вычисляет предоставленное выражение для всех элементов в коллекции. Ниже приведен пример:

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

Создание определяемых пользователем агрегатных функций

Вы можете включить собственные пользовательские статистические функции в выражение запроса, добавив методы расширения в IEnumerable<T> тип. Затем настраиваемый метод может выполнить вычисление или операцию в перечисленной коллекции, на которую ссылается агрегатная функция. Дополнительные сведения о методах расширения см. в разделе Методы расширения.

Например, в следующем примере показана пользовательская агрегатная функция, которая вычисляет медиановое значение коллекции чисел. Существует две перегрузки Median метода расширения. Первая перегрузка принимает в качестве входных данных коллекцию типов IEnumerable(Of Double). Median Если агрегатная функция вызывается для поля запроса типаDouble, этот метод будет вызван. Вторая перегрузка метода может быть передана любому универсальному 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

В следующем примере показаны примеры запросов, которые вызывают Median агрегатную функцию для коллекции типов Integerи коллекцию типов Double. Запрос, вызывающий Median агрегатную функцию в коллекции типов Double , вызывает перегрузку Median метода, который принимает в качестве входных данных коллекцию типов Double. Запрос, вызывающий Median агрегатную функцию в коллекции типов Integer , вызывает универсальную перегрузку 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

См. также