Gestion de bibliothèque personnelle auto-hébergée : catalogue, prêts, scan de code-barres, consultation hors-ligne. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
51 lines
1.5 KiB
C#
51 lines
1.5 KiB
C#
namespace MaBibli.Shared.Dtos;
|
|
|
|
/// <summary>Calcul des compteurs récursifs de l'arbre des séries.</summary>
|
|
public static class TotauxSeries
|
|
{
|
|
public static IReadOnlyDictionary<int, (int Possedes, int Total)> Calculer(
|
|
IReadOnlyList<SerieDto> series)
|
|
{
|
|
var parentees = series
|
|
.Where(s => s.SerieParenteId is not null)
|
|
.GroupBy(s => s.SerieParenteId!.Value)
|
|
.ToDictionary(g => g.Key, g => g.ToList());
|
|
var resultat = new Dictionary<int, (int Possedes, int Total)>();
|
|
var enCours = new HashSet<int>();
|
|
|
|
(int Possedes, int Total) CalculerUne(SerieDto serie)
|
|
{
|
|
if (resultat.TryGetValue(serie.Id, out var connu))
|
|
{
|
|
return connu;
|
|
}
|
|
|
|
if (!enCours.Add(serie.Id))
|
|
{
|
|
return (0, 0);
|
|
}
|
|
|
|
var total = (serie.NombrePossedes, serie.Elements.Count);
|
|
if (parentees.TryGetValue(serie.Id, out var filles))
|
|
{
|
|
foreach (var fille in filles)
|
|
{
|
|
var sousTotal = CalculerUne(fille);
|
|
total = (total.Item1 + sousTotal.Possedes, total.Item2 + sousTotal.Total);
|
|
}
|
|
}
|
|
|
|
enCours.Remove(serie.Id);
|
|
resultat[serie.Id] = total;
|
|
return total;
|
|
}
|
|
|
|
foreach (var serie in series)
|
|
{
|
|
CalculerUne(serie);
|
|
}
|
|
|
|
return resultat;
|
|
}
|
|
}
|