Статистическое предложение (Visual Basic)
Обновлен: Ноябрь 2007
К коллекции применяется одна или несколько статистических функций.
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. Пример.Dim customerList1 = Aggregate order In orders _ Into AllOrdersOver100 = All(order.Total >= 100)
Any
Возвращает true, если все элементы в коллекции удовлетворяют указанному условию. В противном случае возвращает false. Пример.Dim customerList2 = From cust In customers _ Aggregate order In cust.Orders _ Into AnyOrderOver500 = Any(order.Total >= 500)
Average
Вычисляет среднее значение всех элементов в коллекции или указанное выражение для всех элементов в коллекции. Пример.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
Ссылается на результаты запроса, которые сгруппированы в результате выполнения предложения Group By или Group Join. Функция Group допустима только в предложении Into предложения Group By или предложения Group Join. Дополнительные сведения и примеры см. в разделах Предложение Group By (Visual Basic) и Предложение Group Join (Visual Basic).LongCount
Подсчет числа элементов в коллекции. Можно указать необязательное выражение Boolean для подсчета числа только тех элементов в коллекции, которые удовлетворяют условию. Возвращает результат типа Long. Пример см. в разделе "Статистическая функция Count".Max
Вычисляет максимальное значение всех элементов в коллекции или указанное выражение для всех элементов в коллекции. Пример.Dim customerMaxOrder = Aggregate order In orders _ Into MaxOrder = Max(order.Total)
Min
Вычисляет минимальное значение всех элементов в коллекции или указанное выражение для всех элементов в коллекции. Пример.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>. Пользовательский метод может выполнить расчет или операцию на перечисление коллекции, на которую есть ссылки в статистической функции. Дополнительные сведения о методах расширения см. в разделе Методы расширения (Visual Basic).
Например, в следующем примере показана пользовательская статистическая функция, вычисляющая значение медианы из коллекции чисел. Существуют две перегрузки метода расширения 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 medianAggregate As IEnumerable(Of Double)) As Double
If medianAggregate.Count = 0 Then
Throw New InvalidOperationException("Cannot compute median for an empty set.")
End If
Dim sortedList = From number In medianAggregate 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 medianAggregate As IEnumerable(Of T), _
ByVal selector As Func(Of T, Double)) As Double
Return (From element In medianAggregate Select selector(element)).Median()
End Function
End Module
В следующем примере показаны примеры запросов вызова статистической функции Median для коллекции типа Integer и коллекции типа Double. Запрос, который вызывает статистическую функцию Median для коллекции типа Double, вызывает перегрузку метода Median, который принимает тип Double в качестве выходных данных. Запрос, который вызывает статистическую функцию Median для коллекции типа Integer, вызывает универсальную перегрузку метода Median.
Module Module1
Sub Main()
Dim numbers1 As Integer() = New Integer() {1, 2, 3, 4, 5}
Dim query1 = Aggregate num In numbers1 Into Median(num)
Console.WriteLine("Median = " & query1)
Dim numbers2 As Double() = New Double() {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
См. также
Основные понятия
Знакомство с LINQ в Visual Basic
Ссылки
Предложение Select (Visual Basic)
Предложение Where (Visual Basic)
Предложение Group By (Visual Basic)