Implémente C1 à C5 pour les séries et cycles
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
co-authored by
Copilot
parent
3d5e73838e
commit
ddc60898da
@@ -93,3 +93,12 @@ public record OrdreElementsSerie
|
||||
{
|
||||
public List<int> Ids { get; set; } = [];
|
||||
}
|
||||
|
||||
/// <summary>Nouvel ordre des séries directement contenues dans un cycle.</summary>
|
||||
public record OrdreSeries
|
||||
{
|
||||
public List<int> Ids { get; set; } = [];
|
||||
}
|
||||
|
||||
/// <summary>Déplacement d'une série dans l'ordre de lecture de son cycle.</summary>
|
||||
public readonly record struct DeplacementSerie(int SerieId, int ParenteId, int Delta);
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user