コード例 #1
0
        public void Calcular(IList <InfoPartido> partidos, int curulesDisponibles)
        {
            if (curulesDisponibles < 1)
            {
                throw new ArgumentException("No hay curules suficientes para realizar el cálculo");
            }

            int curulesAsignadas = curulesDisponibles;
            Dictionary <InfoPartido, decimal> dic = partidos.ToDictionary(k => k, v => v.VotosGanados * 1.0m);

            while (curulesAsignadas > 0)
            {
                // buscar el mayor
                List <KeyValuePair <InfoPartido, decimal> > m =
                    (from itm in dic orderby itm.Value descending select itm).ToList();

                // asignar curul
                InfoPartido partido = m[0].Key;
                partido.CurulesAsignadas = partido.CurulesAsignadas + 1;

                // decrementar indice y curules pendientes
                decimal cociente = partido.CurulesAsignadas == 1 ? 1.4m : ((2 * partido.CurulesAsignadas) + 1);
                dic[partido] = (partido.VotosGanados * 1m) / cociente;
                curulesAsignadas--;
            }
        }
コード例 #2
0
        public void Calcular(IList <InfoPartido> partidos, int curulesDisponibles)
        {
            if (curulesDisponibles < 1)
            {
                throw new ArgumentException("No hay curules suficientes para realizar el cálculo");
            }

            int curulesAsignadas = curulesDisponibles;
            Dictionary <InfoPartido, decimal> dic = partidos.ToDictionary(k => k, v => v.VotosGanados * 1.0m);

            while (curulesAsignadas > 0)
            {
                // buscar el mayor
                List <KeyValuePair <InfoPartido, decimal> > m =
                    (from itm in dic orderby itm.Value descending select itm).ToList();

                // asignar curul
                InfoPartido partido = m[0].Key;
                partido.CurulesAsignadas = partido.CurulesAsignadas + 1;

                // decrementar indice y curules pendientes
                dic[partido] = (partido.VotosGanados * 1m) / ((partido.CurulesAsignadas) + 1);
                curulesAsignadas--;
            }

            /*
             * var dic = new Dictionary<int, Dictionary<InfoPartido, decimal>>();
             * for (int i = 1; i <= curulesDisponibles; i++)
             * {
             *  dic.Add(i, new Dictionary<InfoPartido, decimal>());
             *  Dictionary<InfoPartido, decimal> elem = dic[i];
             *  foreach (InfoPartido infoPartido in partidos)
             *  {
             *      decimal coeficiente = infoPartido.VotosGanados / (i * 1.0m);
             *      elem.Add(infoPartido, coeficiente);
             *  }
             * }
             * var q = (from i in dic
             *  from d in i.Value
             *  orderby d.Value descending
             *  select new {Partido = d.Key, Peso = d.Value}).ToList();
             *
             * int curulesAsignadas = curulesDisponibles;
             * foreach (var itm in q)
             * {
             *  itm.Partido.CurulesAsignadas = itm.Partido.CurulesAsignadas + 1;
             *  curulesAsignadas--;
             *  if (curulesAsignadas <= 0) break;
             * }
             */
        }
コード例 #3
0
        private static IList <InfoPartido> LeerPartidos()
        {
            IList <InfoPartido> result = new List <InfoPartido>();

            while (true)
            {
                string partidoNombre = UtilConsola.LeerString("Nombre del partido a ingresar (vacio para salir) ");
                if (String.IsNullOrEmpty(partidoNombre))
                {
                    break;
                }

                int votos       = UtilConsola.LeerInt("Votos ganados de este partido  (max:1000000000):", 0, 1000000000);
                var infoPartido = new InfoPartido {
                    Nombre = partidoNombre, VotosGanados = votos
                };
                result.Add(infoPartido);
            }
            return(result);
        }
コード例 #4
0
        public static void Verificar(IList <InfoPartido> partidos, string nombre, int valorEsperado)
        {
            InfoPartido partido = partidos.First(p => p.Nombre == nombre);

            Assert.AreEqual(valorEsperado, partido.CurulesAsignadas);
        }