2015-10-07 5 views
1

У меня есть список объектов, а один из элементов - другой список. Как я могу группировать их на основе внутреннего списка. Вот пример того, что я хочу сделать.Список по другому содержащемуся списку

class Student 
{ 
    public string Name; 
    public int Age; 
    public List<GroupInfo> GroupList; // This is the inner list 
} 

class GroupInfo 
{ 
    public string GroupName; 
    public int GroupId; 
} 

static void Main() 
{ 
    GroupInfo firstGroup = new GroupInfo 
    { 
     GroupId = 1, 
     GroupName = "First group" 
    }; 

    GroupInfo secondGroup = new GroupInfo 
    { 
     GroupId = 2, 
     GroupName = "Second group" 
    }; 

    GroupInfo thirdGroup = new GroupInfo 
    { 
     GroupId = 3, 
     GroupName = "Third group" 
    }; 

    GroupInfo fourthGroup = new GroupInfo 
    { 
     GroupId = 4, 
     GroupName = "Fourth group" 
    }; 

    List<Student> studentList = new List<Student>(); 

    Student firstStudent = new Student(); 
    firstStudent.Name = "Name1"; 
    firstStudent.Age = 15; 
    firstStudent.GroupList = new List<GroupInfo>(); 
    firstStudent.GroupList.Add(firstGroup); 
    firstStudent.GroupList.Add(secondGroup); 
    studentList.Add(firstStudent); 

    Student secondStudent = new Student(); 
    secondStudent.Name = "Name2"; 
    secondStudent.Age = 17; 
    secondStudent.GroupList = new List<GroupInfo>(); 
    secondStudent.GroupList.Add(firstGroup); 
    secondStudent.GroupList.Add(thirdGroup); 
    studentList.Add(secondStudent); 

    Student thirdStudent = new Student(); 
    thirdStudent.Name = "Name3"; 
    thirdStudent.Age = 18; 
    thirdStudent.GroupList = new List<GroupInfo>(); 
    thirdStudent.GroupList.Add(secondGroup); 
    thirdStudent.GroupList.Add(thirdGroup); 
    thirdStudent.GroupList.Add(fourthGroup); 
    studentList.Add(thirdStudent); 

    List<GroupInfo> groupInfoList = new List<GroupInfo>(); 
    // Now What I want is to get a group List Where... 
    foreach (var student in studentList) 
    { 
     // ...First Group Should contains firstStudent and secondStudent 
     // Second group Should firstStudent & thirdStudent 
     // Third group Should contains secondStudent & thirdStuden 
     // Fourth Group Should contains only thirdStudent 
     } 
    } 

Один из способов - перебрать весь список и заполнить список GroupInfo. Просто интересно, есть ли другой способ выполнить эту задачу.

+0

взгляд на следующую ссылку http://stackoverflow.com/questions/13747344/group-nested-list-with-linq –

+0

Something как это сделает трюк: var groupedStudents = studentList.SelectMany (x => x.GroupList, (student, groupInfo) => new {Student = student, Group = groupInfo}) .GroupBy (x => x. Группа); Но я думаю, что вы действительно хотите, так это добавить связь между группами и учениками? Поэтому, когда вы добавляете группу в список групп учеников, этот студент должен быть добавлен в список учеников группы и наоборот. –

ответ

1

Вы можете сделать это с SelectMany, как это: -

var result = studentList.SelectMany(x => x.GroupList, 
             (studentObj, groups) => new { studentObj, groups }) 
         .GroupBy(x => new { x.groups.GroupId, x.groups.GroupName }) 
         .Select(x => new 
           { 
            GroupId = x.Key.GroupId, 
            GroupName = x.Key.GroupName, 
            Students = x.Select(z => z.studentObj).ToList() 
           }); 

Поскольку ваш GroupInfo класса имеет только два свойства, т.е. GroupId & GroupName, вы не сможете получать студент, связанные с ним. Именно по этой причине я получаю анонимный тип.

Я получаю следующий вывод с этим запросом: -

enter image description here

+1

Совершенно, как я хотел Рахул. Большое спасибо. – Pankaj

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