方法: 入れ子になったグループを作成する (C# プログラミング ガイド)

LINQ クエリ式で入れ子になったグループを作成する方法を次の例に示します。 学年または成績レベルに基づいて作成した各グループを、さらに各自の名前に基づくグループに分割します。

使用例

public void QueryNestedGroups()
{
    var queryNestedGroups =
        from student in students
        group student by student.Year into newGroup1
        from newGroup2 in
            (from student in newGroup1
             group student by student.LastName)
        group newGroup2 by newGroup1.Key;

    // Three nested foreach loops are required to iterate 
    // over all elements of a grouped group. Hover the mouse 
    // cursor over the iteration variables to see their actual type.
    foreach (var outerGroup in queryNestedGroups)
    {
        Console.WriteLine("DataClass.Student Level = {0}", outerGroup.Key);
        foreach (var innerGroup in outerGroup)
        {
            Console.WriteLine("\tNames that begin with: {0}", innerGroup.Key);
            foreach (var innerGroupElement in innerGroup)
            {
                Console.WriteLine("\t\t{0} {1}", innerGroupElement.LastName, innerGroupElement.FirstName);
            }
        }
    }
}
/*
 Output:
DataClass.Student Level = SecondYear
        Names that begin with: Adams
                Adams Terry
        Names that begin with: Garcia
                Garcia Hugo
        Names that begin with: Omelchenko
                Omelchenko Svetlana
DataClass.Student Level = ThirdYear
        Names that begin with: Fakhouri
                Fakhouri Fadi
        Names that begin with: Garcia
                Garcia Debra
        Names that begin with: Tucker
                Tucker Lance
DataClass.Student Level = FirstYear
        Names that begin with: Feng
                Feng Hanying
        Names that begin with: Mortensen
                Mortensen Sven
        Names that begin with: Tucker
                Tucker Michael
DataClass.Student Level = FourthYear
        Names that begin with: Garcia
                Garcia Cesar
        Names that begin with: O'Donnell
                O'Donnell Claire
        Names that begin with: Zabokritski
                Zabokritski Eugene        
 */

入れ子になったグループの内部の要素を反復処理するために、3 つの入れ子になった foreach ループが必要です。

コードのコンパイル

この例には、「方法 : オブジェクトのコレクションを照会する (C# プログラミング ガイド)」のサンプル アプリケーションで定義されているオブジェクトへの参照があります。 このメソッドをコンパイルして実行するには、メソッドをそのアプリケーションの StudentClass クラスに貼り付け、Main メソッドからそのメソッドを呼び出すコードを追加します。

独自のアプリケーションに合わせてこのメソッドを変更する場合、LINQ には .NET Framework Version 3.5 が必要なこと、および System.Core.dll への参照と System.Linq の using ディレクティブをプロジェクトに含める必要があることに注意してください。 LINQ to SQL、LINQ to XML、および LINQ to DataSet の場合は、追加の using と参照も必要です。 詳細については、「方法 : LINQ プロジェクトを作成する」を参照してください。

参照

概念

LINQ クエリ式 (C# プログラミング ガイド)