istudent Ответов: 2

Как создать единый объект с коллекцией объектов из коллекции путем группировки по идентификатору


У меня есть список студентов, который выглядит следующим образом

List<StudentData> results= new List<StudentData>{
 
new Student{Id = 1, Name = "John", CourseName = "Math", CourseStatus ="Complete"}, 
 new Student{Id = 1, Name = "John", CourseName = "Science", CourseStatus ="In Complete"},
new Student{Id = 1, Name = "John", CourseName = "English", CourseStatus ="Complete"},
new Student{Id = 2, Name = "Sarah", CourseName = "Math", CourseStatus ="Complete"},
new Student{Id = 2, Name = "Sarah", CourseName = "Computer", CourseStatus ="Complete"},
new Student{Id = 2, Name = "John Doe", CourseName = "Account", CourseStatus ="Complete"}, 
 
}



Я хочу создать студента со списком курсов из приведенного выше набора данных.

Student john = new Student();
 
john.Id = 1 , john.Name = "John", john.Courses = new List<Course>{
 new Course{Name = "Math", CourseStatus ="Complete"}, 
new Course{Name = "Science", CourseStatus ="In Complete"},
new Course{Name = "English", CourseStatus ="Complete"}, 
} 


Как мне этого добиться ?

Что я уже пробовал:

var query= results.GroupBy(s=> s.Id);


Student st = new Student();
foreach (var group in query)
{
<pre> st.myCourses = new List<MyCourse>();
                foreach (var st in group )
                {
                        MyCourse c = new MyCourse();
                        c.Name= st.CourseName;
                        c.Status = st.Status;

                     st.myCourses.Add(c);
                }


}

2 Ответов

Рейтинг:
2

Maciej Los

Взгляните на приведенный ниже пример:

void Main()
{

	List<Student> StudentData= new List<Student>{
		new Student(){Id = 1, Name = "John", CourseName = "Math", CourseStatus ="Complete"}, 
		new Student(){Id = 1, Name = "John", CourseName = "Science", CourseStatus ="In Complete"},
		new Student(){Id = 1, Name = "John", CourseName = "English", CourseStatus ="Complete"},
		new Student(){Id = 2, Name = "Sarah", CourseName = "Math", CourseStatus ="Complete"},
		new Student(){Id = 2, Name = "Sarah", CourseName = "Computer", CourseStatus ="Complete"},
		new Student(){Id = 3, Name = "John Doe", CourseName = "Account", CourseStatus ="Complete"}, 
		};

	List<Studentv2> result = StudentData
		.GroupBy(x => x.Id)
		.Select(grp => new Studentv2()
			{
				StudentId = grp.Key,
				StudentName = grp.Select(x => x.Name).First(),
				Courses = grp.Select((x,y) => new Course
					{
						CourseId = y+1,
						CourseName = x.CourseName,
						CourseStatus = x.CourseStatus
					}).ToList()
			})
		.ToList();
	//a result list is ready to use ;)

}

// Define other methods and classes here
public class Student
{
	public int Id=0;
	public string Name = string.Empty;
	public string CourseName = string.Empty;
	public string CourseStatus = string.Empty;
}

public class Studentv2
{
	public int StudentId=0;
	public string StudentName = string.Empty;
	public List<Course> Courses = null; 
}

public class Course
{
	public int CourseId = 0;
	public string CourseName = string.Empty;
	public string CourseStatus = string.Empty;

}


Удачи вам!


Рейтинг:
17

OriginalGriff

Взгляните на это: Использование Linq для создания словаря вложенных списков путем группировки из коллекции.[^] - он не делает точно то, что вы хотите, но он показывает жесткий бит, который генерирует коллекцию. Передать это ученику-конструктору не должно быть слишком сложно.


istudent

В моем вышеприведенном разделе "Что я пробовал" я не смог назначить идентификатор и имя для одного студента. Список курсов хорош. Но мне просто нужно только одно удостоверение личности и одно имя из этой коллекции.

istudent

вот что я сделал
вот что я сделал

var stData= результаты.Метод groupBy(ы=&ГТ; новое { ов.ИД, С. Название})
.Выберите(grp => новый студент{
ИД= ВРП.Ключ.Идентификатор,
Название= ВРП.Ключ.Название,
Курсы = grp.Select(x=>Новый курс
{
Название = Х.CourseName,
Статус = х.CourseStatus
}).Толист()
});