質問

I had made a nested group through Linq.I had made the first group on the basis of zeroth element of student's name.Second group is on the basis of student's name.I am not able to get the key of outer group i.e 'h' or 'a'.Please Help.

Code:

List<student> li = new List<practice.student>()
{
    new student(){name="harry",marks=50},
    new student(){name="harry",marks=60},
    new student(){name="hermione",marks=50},
    new student(){name="hermione",marks=60},
    new student(){name="ajax",marks=60},
    new student(){name="ajax",marks=70},
    new student(){name="abby",marks=60},
    new student(){name="abby",marks=70}
};

var query1 = li.GroupBy(t => t.name[0]).Select(t => t.GroupBy(s => s.name));

foreach (var item in query1) 
{
    Console.WriteLine(item.Select(t=>t.Key));

    foreach (var item1 in item) 
    {
        Console.WriteLine("Key:"+item1.Key);

        foreach (var item2 in item1) 
        {
            Console.WriteLine(item2.name+","+item2.marks);
        }
        Console.WriteLine();
    }
    Console.WriteLine();
}

Output:

System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Linq.IGrouping`2[S
ystem.String,practice.student],System.String]
Key:harry
harry,50
harry,60

Key:hermione
hermione,50
hermione,60


System.Linq.Enumerable+WhereSelectEnumerableIterator`2[System.Linq.IGrouping`2[S
ystem.String,practice.student],System.String]
Key:ajax
ajax,60
ajax,70

Key:abby
abby,60
abby,70
役に立ちましたか?

解決

You can make use of an anonymous type, e.g.:

var query1 = li.GroupBy(t => t.name[0]).Select(t => new {Letter=t.Key, Students=t.GroupBy(s => s.name)});

foreach (var item in query1) 
{
    Console.WriteLine(item.Letter);
    foreach (var item1 in item.Students) 
    {
        Console.WriteLine("Key:" + item1.Key);
        foreach (var item2 in item1) 
        {
            Console.WriteLine(item2.name+","+item2.marks);
        }
        Console.WriteLine();
    }
    Console.WriteLine();

}

or, to shorten your code, just use GroupBy in the foreach loops:

foreach(var letter in li.GroupBy(l => l.name[0]).OrderBy(l => l.Key))
{
    Console.WriteLine("Letter:" + letter.Key);
    foreach (var student in letter.GroupBy(l => l.name).OrderBy(l => l.Key)) 
    {
        Console.WriteLine(String.Format("\n\tKey: {0}", student.Key));
        foreach (var mark in student.OrderBy(s => s.marks)) 
            Console.WriteLine(String.Format("\t\t{0}, {1}", mark.name, mark.marks));
    }
    Console.WriteLine();
}

Output:

Letter:a

  Key: abby
    abby, 60
    abby, 70

  Key: ajax
    ajax, 60
    ajax, 70

Letter:h

  Key: harry
    harry, 50
    harry, 60

  Key: hermione
    hermione, 50
    hermione, 60
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top