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