Предложение 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, Count, LongCount, Max, Min и Sum.Эти функции знакомы разработчикам, работавшим с агрегатными функциями в SQL.Они описаны далее в этом разделе.
Результат агрегатной функции включается в результат запроса в виде поля типа результата запроса.Можно указать псевдоним для результатов агрегатной функции, чтобы указать имя члена типа результата запроса, который будет содержать значение статистического выражения.Если псевдоним не указан, используется имя агрегатной функции.
Предложение Aggregate может располагаться в начале запроса или использоваться в нем в качестве дополнительного предложения.Если предложение Aggregate располагается в начале запроса, результатом является одно значение, которое представляет результат агрегатной функции, указанной в предложении Into.Если в предложении Into указано несколько агрегатных функций, запрос возвращает отдельный тип с отдельным свойством, ссылающийся на результаты каждой агрегатной функции в предложении Into.Если предложение Aggregate включено в запрос как дополнительное предложение, тип возвращаемой коллекции запроса будет иметь отдельные свойства, ссылающиеся на результат каждой агрегатной функции предложенияInto.
Агрегатные функции
Ниже перечислены стандартные агрегатные функции, которые могут указываться вместе с предложением Aggregate.
Функция |
Описание |
All |
Возвращает true, если все элементы в коллекции удовлетворяют указанному условию. В противном случае возвращает false.Например: |
Any |
Возвращает true, если все элементы в коллекции удовлетворяют указанному условию. В противном случае возвращает false.Например: |
Average |
Вычисляет среднее значение всех элементов в коллекции или указанное выражение для всех элементов в коллекции.Например: |
Count |
Подсчет числа элементов в коллекции.Можно указать необязательное выражение Boolean для подсчета числа только тех элементов в коллекции, которые удовлетворяют условию.Например: |
Group |
Ссылается на результаты запроса, которые сгруппированы в результате выполнения предложения Group By или Group Join.Функция Group допустима только в предложении Into предложения Group By или предложения Group Join.Дополнительные сведения и примеры см. в разделах Предложение Group By (Visual Basic) и Предложение Group Join (Visual Basic). |
LongCount |
Подсчет числа элементов в коллекции.Можно указать необязательное выражение Boolean для подсчета числа только тех элементов в коллекции, которые удовлетворяют условию.Возвращает результат типа Long.Пример см. в разделе "Агрегатная функция Count". |
Max |
Вычисляет максимальное значение всех элементов в коллекции или указанное выражение для всех элементов в коллекции.Например: |
Min |
Вычисляет минимальное значение всех элементов в коллекции или указанное выражение для всех элементов в коллекции.Например: |
Sum |
Вычисляет сумму всех элементов в коллекции или указанное выражение для всех элементов в коллекции.Например: |
Пример
В следующем примере показывается использование предложения 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>.Пользовательский метод может выполнить расчет или операцию на перечисление коллекции, на которую есть ссылки в агрегатной функции.Дополнительные сведения о методах расширения см. в разделе Методы расширения (Visual Basic).
Например, в следующем примере показана пользовательская агрегатная функция, вычисляющая значение медианы из коллекции чисел.Существуют две перегрузки метода расширения Median.Первая перегрузка в качестве входных данных принимает коллекцию типа IEnumerable(Of Double).Если агрегатная функция Median вызывается для поля типа Double, будет вызван этот метод.Второй способ перегрузки метода Median — это передача в него любого базового типа.Универсальная перегрузка метода Median принимает второй параметр, который ссылается на лямбда-выражение Func(Of T, Double), чтобы проектировать значения для типа (из коллекции), как значение соответствующего типа Double.Затем делегируется расчет значения медианы другой перегрузке метода Median.Дополнительные сведения о лямбда-выражениях см. в разделе Лямбда-выражения (Visual Basic).
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
См. также
Ссылки
Предложение Select (Visual Basic)
Предложение From (Visual Basic)
Предложение Where (Visual Basic)
Предложение Group By (Visual Basic)
Основные понятия
Знакомство с LINQ в Visual Basic