ElectionsMandateCalculator.Models.MandatesCalculator.GiveAdditionalMandatesOnNationalLevel C# (CSharp) Method

GiveAdditionalMandatesOnNationalLevel() private method

private GiveAdditionalMandatesOnNationalLevel ( int partiesCountTable2, List &partiesWithCalcInfo, int &mandatesLeft ) : void
partiesCountTable2 int
partiesWithCalcInfo List
mandatesLeft int
return void
        private void GiveAdditionalMandatesOnNationalLevel(int partiesCountTable2, ref List<PartyCalcInfo> partiesWithCalcInfo, ref int mandatesLeft)
        {
            Logger.Info("\r\n==Разпределяне на допълнителни мандати на национално ниво==");
            var partiesOrderedByCoefR = partiesWithCalcInfo.OrderByDescending(p => p.MandateCoefHareR).ToArray();
            int mi = 0;
            while (mandatesLeft > 0)
            {
                decimal currR = partiesOrderedByCoefR[mi].MandateCoefHareR;
                int k = 0;
                int j = mi + 1;
                while (j < partiesCountTable2 && partiesOrderedByCoefR[j].MandateCoefHareR == currR)
                {
                    k++;
                }
                if (k > mandatesLeft)
                {
                    Logger.Info("Достигнат е случай на партии с равни коефициенти:");
                    for (int p = mi; p < mi + k; p++)
                    {
                        Logger.Info(partiesOrderedByCoefR[p].ToString());
                    }

                    if (_lots.Count > 0)
                    {
                        if (_lots.Count != mandatesLeft)
                        {
                            throw new ArgumentException(string.Format("Броя партии избрани със жребии({0}) е различен от останалите мандати - {1}", _lots.Count, mandatesLeft));
                        }
                        foreach (var lot in _lots)
                        {
                            var partyToGiveMandate = partiesOrderedByCoefR.First(p => p.PartyId == lot.PartyId);
                            if (partyToGiveMandate == null)
                            {
                                throw new ArgumentException("Невалиден жребии за партия с ID:" + lot.PartyId);
                            }
                            partyToGiveMandate.MandatesGivenAdditional++;
                            mandatesLeft--;
                        }
                    }
                    else
                    {
                        Logger.Info("Достигнат е жребии, за който няма резултати!");
                        IsLotReachedAndNoLots = true;
                    }
                }
                else
                {
                    partiesOrderedByCoefR[mi].MandatesGivenAdditional++;
                    mi++;
                    mandatesLeft--;
                };
            }

            partiesWithCalcInfo = partiesOrderedByCoefR.OrderBy(p => p.Index).ToList();

            Logger.logger.Info("Крайно разпределяне на мандати по партии:");
            LogNationalMandatesByParties(partiesWithCalcInfo);
        }