Aggregate 句 (Visual Basic)
1 つ以上の集計関数をコレクションに適用します。
構文
Aggregate element [As type] In collection _
[, element2 [As type2] In collection2, [...]]
[ clause ]
Into expressionList
指定項目
用語 | 定義 |
---|---|
element |
必須です。 コレクションの要素の反復処理に使用される変数。 |
type |
任意。 element の型。 型が指定されていない場合、element の型は collection から推論されます。 |
collection |
必須です。 操作対象のコレクションを参照します。 |
clause |
任意。 Aggregate 句を適用するクエリ結果を絞り込むための Where 句などの 1 つ以上のクエリ句。 |
expressionList |
必須です。 コレクションに適用する集計関数を識別する 1 つ以上のコンマ区切り式。 集計関数に別名を適用して、クエリ結果のメンバー名を指定できます。 別名が指定されていない場合、集計関数の名前が使用されます。 例については、このトピックで後述する集計関数に関するセクションを参照してください。 |
Remarks
Aggregate
句を使用して、クエリに集計関数を含めることができます。 集計関数は、値の集まりに対して、チェックと計算を実行し、1 つの値を返します。 クエリ結果の型のメンバーを使用して、計算された値にアクセスできます。 使用できる標準の集計関数は、All
、Any
、Average
、Count
、LongCount
、Max
、Min
、Sum
関数です。 これらの関数は、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)
カウント
コレクション内の要素の数をカウントします。 条件を満たすコレクション内の要素の数のみをカウントする省略可能な Boolean
式を指定できます。 次に例を示します。
Dim customerOrderAfter1996 = From cust In customers
Aggregate order In cust.Orders
Into Count(order.OrderDate > #12/31/1996#)
グループ化
Group By
または Group Join
句の結果として、グループ化されたクエリ結果を参照します。 Group
関数は、Group By
または Group Join
句の Into
句でのみ有効です。 詳細と例については、「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
拡張メソッドには、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 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
次の例は、Integer
型のコレクションと Double
型のコレクションに対して Median
集計関数を呼び出すサンプル クエリを示しています。 Double
型のコレクションに対して Median
集計関数を呼び出すクエリは、Double
型のコレクションを入力として受け入れる Median
メソッドのオーバーロードを呼び出します。 Integer
型のコレクションに対して Median
集計関数を呼び出すクエリは、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
関連項目
.NET