Files
LehrerApp/LehrerApp.Core/Services/GradingService.cs
2026-03-29 23:47:31 +02:00

91 lines
3.1 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using LehrerApp.Core.Models;
namespace LehrerApp.Core.Services;
public class GradingService
{
/// <summary>
/// Berechnet die Note aus Punkten anhand des Notenschlüssels der Klausur.
/// </summary>
public string CalculateGrade(double achieved, double maximum, List<GradingKeyEntry> key)
{
if (maximum <= 0) return "-";
var percent = achieved / maximum * 100.0;
return key
.OrderByDescending(k => k.MinPercent)
.FirstOrDefault(k => percent >= k.MinPercent)
?.Grade ?? key.OrderBy(k => k.MinPercent).First().Grade;
}
/// <summary>
/// Standardnotenschlüssel 16 nach NRW-Schema (anpassbar).
/// </summary>
public static List<GradingKeyEntry> DefaultKey1To6() =>
[
new() { Grade = "1", MinPercent = 87.5 },
new() { Grade = "2", MinPercent = 75.0 },
new() { Grade = "3", MinPercent = 62.5 },
new() { Grade = "4", MinPercent = 50.0 },
new() { Grade = "5", MinPercent = 25.0 },
new() { Grade = "6", MinPercent = 0.0 },
];
/// <summary>
/// Standardnotenschlüssel 015 Punkte (Oberstufe).
/// </summary>
public static List<GradingKeyEntry> DefaultKey0To15() =>
[
new() { Grade = "15", MinPercent = 95.0 },
new() { Grade = "14", MinPercent = 90.0 },
new() { Grade = "13", MinPercent = 85.0 },
new() { Grade = "12", MinPercent = 80.0 },
new() { Grade = "11", MinPercent = 75.0 },
new() { Grade = "10", MinPercent = 70.0 },
new() { Grade = "9", MinPercent = 65.0 },
new() { Grade = "8", MinPercent = 60.0 },
new() { Grade = "7", MinPercent = 55.0 },
new() { Grade = "6", MinPercent = 50.0 },
new() { Grade = "5", MinPercent = 45.0 },
new() { Grade = "4", MinPercent = 40.0 },
new() { Grade = "3", MinPercent = 33.0 },
new() { Grade = "2", MinPercent = 27.0 },
new() { Grade = "1", MinPercent = 20.0 },
new() { Grade = "0", MinPercent = 0.0 },
];
/// <summary>
/// Berechnet den Notendurchschnitt aus einer Liste von Notenwerten (1-6 System).
/// </summary>
public double AverageGrade1To6(List<string> grades)
{
var numeric = grades
.Select(g => int.TryParse(g, out var n) ? (int?)n : null)
.Where(n => n.HasValue)
.Select(n => n!.Value)
.ToList();
return numeric.Count == 0 ? 0 : numeric.Average();
}
/// <summary>
/// Berechnet den Notendurchschnitt aus gewichteten Noten.
/// </summary>
public double WeightedAverage(List<(string Grade, double Weight)> grades)
{
var numeric = grades
.Select(g => (
Value: int.TryParse(g.Grade, out var n) ? (int?)n : null,
g.Weight))
.Where(g => g.Value.HasValue)
.ToList();
if (numeric.Count == 0) return 0;
var totalWeight = numeric.Sum(g => g.Weight);
var weightedSum = numeric.Sum(g => g.Value!.Value * g.Weight);
return totalWeight == 0 ? 0 : weightedSum / totalWeight;
}
}