как присвоить значения для списка учащихся при выполнении группы

#c# #linq

#c# #linq

Вопрос:

У меня есть простой список таких данных,

 List<SchoolData> schoolData = new List<SchoolData>
        {
            new SchoolData{ClassName = "A", StudentName = "abc", StudentAge = 1},
            new SchoolData{ClassName = "A", StudentName = "xyz", StudentAge = 2},
            new SchoolData{ClassName = "B", StudentName = "pqr", StudentAge = 10},
            new SchoolData{ClassName = "B", StudentName = "lmn", StudentAge = 11},
        };
  

Здесь мне нужно сгруппировать данные ClassName и упорядочить данные следующим образом,

 var d = new List<RedefineSchoolData>()
        {
            new RedefineSchoolData{ClassName = "A", Students = new List<Student>
            {
                new Student{StudentName = "abc", StudentAge = 1},
                new Student{StudentName = "xyz", StudentAge = 2}
            }}
        };
  

Я пытаюсь сделать так, но как заполнить Students ?

 var group = schoolData.GroupBy(x => x.ClassName);

        foreach (var g in group)
        {
            redefineSchoolDatas.Add(new RedefineSchoolData
            {
                ClassName = g.Key,
                Students = g.ToList() //how to convert
            });
        }
  

Здесь вся структура класса,

  public class SchoolData
    {
        public string ClassName { get; set; }
        public string StudentName { get; set; }
        public int StudentAge { get; set; }
    }

    public class RedefineSchoolData
    {
        public string ClassName { get; set; }
        public List<Student> Students { get; set; }
    }

    public class Student
    {
        public string StudentName { get; set; }
        public int StudentAge { get; set; }
    }
  

Ответ №1:

Вы можете делать все внутри GroupBy:

 var newList = schoolData
    .GroupBy(
        x => x.ClassName,
        (k,v) => new RedefineSchoolData(){
            ClassName=k,
            Students=v.Select(s => new Student(){
                StudentName=s.StudentName,
                StudentAge=s.StudentAge
                }).ToList()
        })
    .ToList();
  

Комментарии:

1. Спасибо Магнетрону. очень хороший однострочник 🙂

Ответ №2:

Что вам нужно, так это следующая строка, чтобы получить свойство Student:

 Students = g.Select(s => new Student
{
    StudentName = s.StudentName,
    StudentAge = s.StudentAge
}).ToList()
  

Вы также можете заменить foreach на:

 var redefineSchoolDatas = group.Select(g => new RedefineSchoolData
{
    ClassName = g.Key,
    Students = g.Select(s => new Student
    {
        StudentName = s.StudentName,
        StudentAge = s.StudentAge
    }).ToList(),
}).ToList();