次の方法で共有


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 任意。 集計句または句を適用するクエリ結果を絞り込むための 1 つ以上のクエリ句 ( Where 句など)。
expressionList 必須。 コレクションに適用する集計関数を識別する 1 つ以上のコンマ区切り式。 集計関数にエイリアスを適用して、クエリ結果のメンバー名を指定できます。 エイリアスが指定されていない場合は、集計関数の名前が使用されます。 例については、このトピックで後述する集計関数に関するセクションを参照してください。

注釈

Aggregate句を使用して、クエリに集計関数を含めることができます。 集計関数は、一連の値に対してチェックと計算を実行し、1 つの値を返します。 クエリ結果の種類のメンバーを使用して、計算された値にアクセスできます。 使用できる標準集計関数は、 AllAnyAverageCountLongCountMaxMin、および 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

こちらも参照ください