次の方法で共有


Aggregate 句 (Visual Basic)

更新 : 2007 年 11 月

1 つ以上の集計関数をコレクションに適用します。

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

指定項目

  • element
    必ず指定します。コレクションの各要素を反復処理するために使用する変数。

  • type
    省略可能です。element の型。型の指定がない場合、element の型は collection から推論されます。

  • collection
    必ず指定します。操作対象のコレクションを参照します。

  • clause
    省略可能です。クエリ結果を絞り込むために集計句に適用する、Where 句などの 1 つ以上のクエリ句。

  • expressionList
    必ず指定します。コレクションに適用する集計関数を識別する、1 つまたは複数のコンマで区切られた式。集計関数にエイリアスを適用して、クエリ結果のメンバ名を指定できます。エイリアスの指定がない場合は、集計関数の名前が使用されます。例については、後の集計関数に関するセクションを参照してください。

解説

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 関数は、Group By 句または Group Join 句の Into 句でのみ有効です。使用例を含む詳細については、「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 拡張メソッドには 2 つのオーバーロードがあります。最初のオーバーロードは、入力として IEnumerable(Of Double) 型のコレクションを受け取ります。Double 型のクエリ フィールドに対して Median 集計関数が呼び出された場合は、このメソッドが呼び出されます。Median メソッドの 2 番目のオーバーロードには、任意のジェネリック型を渡すことができます。Median メソッドのジェネリック オーバーロードは、Func(Of T, Double) ラムダ式を参照する 2 番目のパラメータを受け取り、コレクション内の型の値を対応する 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

次のコード例は、Integer 型のコレクションと Double 型のコレクションに対して Median 集計関数を呼び出す例を示します。Double 型のコレクションに対して Median 集計関数を呼び出すクエリでは、Double 型のコレクションを入力として受け取る Median メソッドのオーバーロードが呼び出されます。Integer 型のコレクションに対して Median 集計関数を呼び出すクエリでは、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

参照

概念

Visual Basic における LINQ の概要

参照

Select 句 (Visual Basic)

From 句 (Visual Basic)

Where 句 (Visual Basic)

Group By 句 (Visual Basic)

その他の技術情報

クエリ (Visual Basic)