public static (CandidatesAndIds candidatesManager, IReadOnlyList <StvBallot> ballots, int seatsCount) StvVoteFrom(char fieldsSeparator = ',', params string[] lines) { if (!int.TryParse(lines[0], out var seatsCount)) { throw new Exception($"Invalid seats count on line'{lines[0]}'"); } var candidatesManager = new CandidatesAndIds(lines[1].Split(fieldsSeparator)); var counter = new StvBallotsCounter(); for (int i = 2; i < lines.Length; i++) { var splits = lines[i].Split(fieldsSeparator); if (!int.TryParse(splits[0], out var multiplicity)) { throw new Exception($"Invalid multiplicity on line'{lines[i]}'"); } counter.AddBallot(multiplicity, splits.Skip(1).Select(candidateName => { if (!candidatesManager.TryGetId(candidateName, out var id)) { throw new Exception($"Unknown candidate {candidateName} on line'{lines[i]}'"); } return(id); }).ToArray()); } return(candidatesManager, counter.GetBallots(), seatsCount); }
public CandidatesStatus(CandidatesAndIds candidatesAndIds) { var(min, max) = candidatesAndIds.GetIdsRange(); if (min < 0) { throw new ArgumentException($"Id must be at least 0 (found {min})"); } candidatesStates = new State[max + 1]; for (int i = 0; i < candidatesStates.Length; i++) { if (candidatesAndIds.IsValidId(i)) { candidatesStates[i] = State.Undecided; TotalCount++; UndecidedCount++; } else { candidatesStates[i] = State.Invalid; } } }