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);
}