如何計算每個學生的平均分?我這樣做了......但平均值對我不起作用,我怎么做?使用 JoinGroup 和 GroupBy ?,我等著看解決方案,謝謝。

var listadoA = alumnos.Join(examenes,
a => a._id,
e => e._alumnoId,
(a, e) => new
{
NombreAlumno = a._nombre,
Examenes = examenes,
Notas = e._nota,
}).Where(p => p.Examenes.Count() >= 1).OrderBy(p => p.NombreAlumno).ToList();
foreach (var obj in listadoA){
var promedio = obj.Average(p => p.Nota);
Console.Write($"\nAlumno = {obj.NombreAlumno}, Promedio ={promedio}");
}
class Examen{
public double _nota{get;set;}
public int _alumnoId {get;set;}
public int cursoId{get;set;}
public Examen(int id, double nota, int idMateria){
this._alumnoId = id;
this.cursoId = idMateria;
this._nota = nota;
}
public override string ToString(){
return ($"Alumno = {this._alumnoId}, Nota = {this._nota}, Curso = {this.cursoId}");
}
public static List<Examen> GetLista(){
return new List<Examen>(){
new Examen(2,5,1),
new Examen(4,7,5),
new Examen(4,9,3),
new Examen(3,10,4),
new Examen(7,5,3),
new Examen(2,8,4),
new Examen(6,9,5),
new Examen(9,7,1),
new Examen(6,5,4),
new Examen(9,1,4),
new Examen(7,9,5),
};
}
}
uj5u.com熱心網友回復:
我的測驗時間有點短,但我認為它應該通過一些小的調整來作業。如果我有任何錯別字,請告訴我:
var listadoA = alumnos.GroupJoin(examenes,
a => a._id,
e => e._alumnoId,
(a, eGroup) => new
{
Alumno = a,
Examenes = eGroup
}).Where(p => p.Examenes.Count() >= 1).OrderBy(p => p.Alumno._nombre).ToList();
foreach (var obj in listadoA){
var promedio = obj.Examenes.Average(e => e._nota);
我很好奇為什么您的以下劃線開頭的欄位可以公開訪問;這是私有欄位的命名約定.. 應該真正為它們提供公共屬性。另外,我假設“nota”是考試成績。
uj5u.com熱心網友回復:
編輯
答案最初是在對所涉及的類進行精確處理之前發布的。我仍然保留英文命名,因為它可能對更廣泛的受眾更清晰。這也有助于澄清我對@Caius Jard 相關評論的回答。
使用 Linq 物件:(不使用物體框架)
與使用 join 相比,此代碼執行以下權衡。它的性能可能較差,但更簡單(您甚至不必了解聯接是什么)。
AveragesByStudents = Students
.Select(s => new
{
StudentName = s.Name,
Notes = Exams
.Where(e => e.StudentId == s.Id)
.Select(e => e.Note)
.ToList()
})
.Select(s => new
{
s.StudentName,
Average = s.Notes.Any() ? s.Notes.Average() : null
});
;
在此示例中,您可以獲得所有學生,即使他們沒有筆記(在這種情況下,他們的平均值為空)。您可以在一個選擇中完成它,但它不會更具可讀性。
在以下示例中,您僅獲取有筆記的學生,因此他們的平均值不能為空。
AveragesByStudents = Students
.Select(s => new
{
StudentName = s.Name,
Notes = Exams
.Where(e => e.StudentId == s.Id)
.Select(e => e.Note)
})
.Where(s => s.Notes.Any())
.Select(s => new
{
s.StudentName,
Average = Notes.Average()
});
;
如果要實作,請在查詢末尾添加 ToList()。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/347611.html
