Поделиться через


Статистическое предложение (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)

Условие From (Visual Basic)

Предложение Where (Visual Basic)

Предложение Group By (Visual Basic)

Другие ресурсы

Запросы (Visual Basic)