2014-02-06 3 views
2

Я сделал вложенную группу через Linq.I сделал первую группу на основе нулевого элемента имени студента. Вторая группа основана на имени студента. I я не могу получить ключ внешней группы, то есть «h» или «a». Пожалуйста, помогите.Не удалось получить ключ внешней группы в Linq

Код:

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(); 
} 

Выход:

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 

ответ

2

Вы можете использовать анонимный тип, например:

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(); 

} 

или, чтобы сократить код, просто использовать GroupBy в петлях foreach:

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(); 
} 

Выход:

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 
+0

спасибо человеку .... это было действительно полезно – Ajay

Смежные вопросы