Sistema D’Hont con C#

Sistema D’Hont con C#

En el post de Arithmos, explico el sistema de selección de diputados mediante el método D’Hont, pero como no, se me ocurrió crear el sistema bajo C# y ahí va.


    public class CongresoDiputados
    {
        public CongresoDiputados()
        {
            Circunscripciones = new List();
            PartidosCircunscripciones = new List();
            PartidosCongreso = new List();
        }
        public List Circunscripciones { get; set; }
        public List PartidosCircunscripciones { get; set; }
        public List PartidosCongreso { get; set; }

        public void Update(List circunscripciones)
        {
            Circunscripciones = circunscripciones;
            circunscripciones.ForEach(c => PartidosCircunscripciones.AddRange(c.PartidosCircunscripcion));
            PartidosCongreso = (from u in PartidosCircunscripciones
                         group u by u.Nombre into newGroup
                         select new PartidoPolitico(newGroup.Key)
                         {
                             DiputadosAsignados = newGroup.Sum(s => s.DiputadosAsignados),
                             NumVotos = newGroup.Sum(s=>s.NumVotos)
                         }).ToList();
        }

        public new string ToString => $"Congreso de los Diputados - Resultado Elecciones\n{PartidosCongreso.Aggregate("", (s, p) => s + p.ToString)}";
    }

    public class Circunscripcion
    {
        public Circunscripcion(string nombre, int diputados)
        {
            NombreCircunscripcion = nombre;
            Diputados = diputados;
            PartidosCircunscripcion = new List();
        }
        public string NombreCircunscripcion { get; set; }
        public int Diputados { get; set; }

        public List PartidosCircunscripcion { get; set; }

        public void Update(List partidos)
        {
            partidos.ForEach(p => Update(p));
        }

        public void Update(PartidoPolitico partido)
        {
            partido.Cociente = Diputados;
            if (PartidosCircunscripcion.Contains(partido))
            {
                PartidosCircunscripcion.Where(p => p.Nombre == partido.Nombre).FirstOrDefault().NumVotos = partido.NumVotos;
            }
            else
            {
                PartidosCircunscripcion.Add(partido);
            }

            var list = new List();
            PartidosCircunscripcion.ForEach(k => list.AddRange(k.Distribuciones));
            var listaOrdenada= list
                .OrderByDescending(v => v.ParticionVotos)
                .Take(Diputados);
            PartidosCircunscripcion.ForEach(k => k.DiputadosAsignados = listaOrdenada.Where(p => p.Nombre == k.Nombre).Count());

        }

        public new string ToString => $"{PartidosCircunscripcion.Aggregate("", (s, p) => s + p.ToString)}";
    }

    public class PartidoPolitico
    {
        public PartidoPolitico(string nombre) : this(nombre, 0) { }

        public PartidoPolitico(string nombre, int numVotos)
        {
            Nombre = nombre.PadRight(10,' ');
            NumVotos = numVotos;
        }

        public string Nombre { get; set; }
        public int NumVotos { get; set; }

        public int Cociente { get; set; } = 10;

        public int DiputadosAsignados { get; set; }

        public List Distribuciones
        {
            get {
                var l = new List();
                l.AddRange(Enumerable.Range(1, Cociente).ToList().Select(n => new Distribucion(Nombre, NumVotos / n)).ToList());
                return l;
            }
        }

        public new string ToString => $"{Nombre}\t{NumVotos} Votos\t\tDiputados:\t{DiputadosAsignados}\n";
    }

    public class Distribucion
    {
        public Distribucion(string nombre, int votos)
        {
            Nombre = nombre;
            ParticionVotos = votos;
        }
        public string Nombre { get; set; }
        public int ParticionVotos { get; set; }
    }

He incluido alguno de los resultados de las elecciones del 10N del 2019 y he aquí los resultados

    class Program
    {
        static void Main(string[] args)
        {

            Circunscripcion Malaga = new Circunscripcion("Málaga", 11);
            Malaga.Update(new List() {
                new PartidoPolitico("PSOE", 225344),
                new PartidoPolitico("PP", 162467),
                new PartidoPolitico("Vox", 161657),
                new PartidoPolitico("UP", 96988),
                new PartidoPolitico("Cs", 66524)});
            Console.WriteLine(Malaga.ToString);

            Circunscripcion Madrid = new Circunscripcion("Madrid", 37);
            Madrid.Update(new List() {
                new PartidoPolitico("PSOE", 948751),
                new PartidoPolitico("PP", 879667),
                new PartidoPolitico("Vox", 647924),
                new PartidoPolitico("UP", 459030),
                new PartidoPolitico("Cs", 316310),
                new PartidoPolitico("Mas Pais", 199172) });
            Console.WriteLine(Madrid.ToString);

            CongresoDiputados Congreso = new CongresoDiputados();
            Congreso.Update(new List()
            {
                Malaga, Madrid
            });
            Console.WriteLine(Congreso.ToString);
            Console.Read();
        }
    }

PSOE            225344 Votos            Diputados:      4
PP              162467 Votos            Diputados:      3
Vox             161657 Votos            Diputados:      2
UP              96988 Votos             Diputados:      1
Cs              66524 Votos             Diputados:      1

PSOE            948751 Votos            Diputados:      10
PP              879667 Votos            Diputados:      10
Vox             647924 Votos            Diputados:      7
UP              459030 Votos            Diputados:      5
Cs              316310 Votos            Diputados:      3
Mas Pais        199172 Votos            Diputados:      2

Congreso de los Diputados - Resultado Elecciones
PSOE            1174095 Votos           Diputados:      14
PP              1042134 Votos           Diputados:      13
Vox             809581 Votos            Diputados:      9
UP              556018 Votos            Diputados:      6
Cs              382834 Votos            Diputados:      4
Mas Pais        199172 Votos            Diputados:      2

Como siempre, el código mejorable.