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