1 つ以上の集計関数をコレクションに適用します。
構文
Aggregate element [As type] In collection _
[, element2 [As type2] In collection2, [...]]
[ clause ]
Into expressionList
部品
| 任期 | 定義 |
|---|---|
element |
必須。 コレクションの要素を反復処理するために使用される変数。 |
type |
任意。
element の型。 型が指定されていない場合、 element の型は collectionから推論されます。 |
collection |
必須。 操作するコレクションを参照します。 |
clause |
任意。 集計句または句を適用するクエリ結果を絞り込むための 1 つ以上のクエリ句 ( Where 句など)。 |
expressionList |
必須。 コレクションに適用する集計関数を識別する 1 つ以上のコンマ区切り式。 集計関数にエイリアスを適用して、クエリ結果のメンバー名を指定できます。 エイリアスが指定されていない場合は、集計関数の名前が使用されます。 例については、このトピックで後述する集計関数に関するセクションを参照してください。 |
注釈
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)
Min
コレクションから最小値を計算するか、コレクション内のすべての要素に対して指定された式を計算します。 以下に例を示します。
Dim customerMinOrder = From cust In customers
Aggregate order In cust.Orders
Into MinOrder = Min(order.Total)
合計
コレクション内のすべての要素の合計を計算するか、コレクション内のすべての要素に対して指定された式を計算します。 以下に例を示します。
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
集計関数 User-Defined 作成する
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 メソッドのオーバーロードを呼び出します。
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
こちらも参照ください
- Visual Basic での LINQ の概要
- クエリ
- Select 句
- From 句
- Where 句
- GROUP BY 句
.NET