static void Main(string[] args) { string input; List <Soldier> list = new List <Soldier>(); while ((input = Console.ReadLine()) != "End") { try { string[] tokens = input.Split(" ", StringSplitOptions.RemoveEmptyEntries); string type = tokens[0]; int id = int.Parse(tokens[1]); if (list.Any(x => x.Id == id)) { continue; } string firstName = tokens[2]; string lastName = tokens[3]; decimal salary; string corps; switch (type) { case "Private": salary = decimal.Parse(tokens[4]); var currPrivate = new Private(firstName, lastName, id, salary); list.Add(currPrivate); break; case "Spy": int codeNumber = int.Parse(tokens[4]); var currSpy = new Spy(firstName, lastName, id, codeNumber); list.Add(currSpy); break; case "LieutenantGeneral": salary = decimal.Parse(tokens[4]); int[] privateIds = input.Split().Skip(5).Select(int.Parse).ToArray(); List <Private> privatesToAdd = new List <Private>(); foreach (var privateId in privateIds) { Private currentPrivate = (Private)list.Where(x => x.Id == privateId).FirstOrDefault(); privatesToAdd.Add(currentPrivate); } var currLGeneral = new LieutenantGeneral(firstName, lastName, id, salary, privatesToAdd); list.Add(currLGeneral); break; case "Engineer": salary = decimal.Parse(tokens[4]); corps = tokens[5]; string[] repairsArr = input.Split().Skip(6).ToArray(); List <Repair> repairsToAdd = new List <Repair>(); for (int i = 0; i < repairsArr.Length - 1; i += 2) { string partName = repairsArr[i]; int hoursWorked = int.Parse(repairsArr[i + 1]); var repair = new Repair(partName, hoursWorked); repairsToAdd.Add(repair); } var currEngineer = new Engineer(firstName, lastName, id, salary, corps, repairsToAdd); list.Add(currEngineer); break; case "Commando": salary = decimal.Parse(tokens[4]); corps = tokens[5]; string[] missionsArr = input.Split().Skip(6).ToArray(); var missionsToAdd = new List <Mission>(); for (int i = 0; i < missionsArr.Length - 1; i += 2) { string codeName = missionsArr[i]; string state = missionsArr[i + 1]; if (state != "Finished" && state != "inProgress") { continue; } var mission = new Mission(codeName, state); missionsToAdd.Add(mission); } var currCommando = new Commando(firstName, lastName, id, salary, corps, missionsToAdd); list.Add(currCommando); break; default: Console.WriteLine("Invalid Type of Soldier!"); break; } } catch (Exception) { continue; } } foreach (var item in list) { Console.WriteLine(item); } }
static void Main(string[] args) { var troops = new Dictionary <string, ISoldier>(); while (true) { string cmd = Console.ReadLine(); if (cmd == "End") { break; } var data = cmd.Split(" ", StringSplitOptions.RemoveEmptyEntries); string soldierType = data[0]; string id = data[1]; string firstName = data[2]; string lastName = data[3]; ISoldier soldier = null; if (soldierType == "Private") { decimal salary = decimal.Parse(data[4]); soldier = new Private(id, firstName, lastName, salary); } else if (soldierType == "LieutenantGeneral") { decimal salary = decimal.Parse(data[4]); var privates = new Dictionary <string, IPrivate>(); for (int i = 5; i < data.Length; i++) { string privateId = data[i]; var currentSoldier = (IPrivate)troops[privateId]; privates.Add(privateId, currentSoldier); } soldier = new LieutenantGeneral(id, firstName, lastName, salary, privates); } else if (soldierType == "Engineer") { decimal salary = decimal.Parse(data[4]); bool isValidCorps = Enum.TryParse(data[5], out Corps corps); if (isValidCorps) { ICollection <IRepair> repairs = new List <IRepair>(); for (int i = 6; i < data.Length; i += 2) { string part = data[i]; int hours = int.Parse(data[i + 1]); IRepair repair = new Repair(part, hours); repairs.Add(repair); } soldier = new Engineer(id, firstName, lastName, salary, corps, repairs); } } else if (soldierType == "Commando") { decimal salary = decimal.Parse(data[4]); bool isValidCorps = Enum.TryParse(data[5], out Corps corps); if (isValidCorps) { ICollection <IMission> missions = new List <IMission>(); for (int i = 6; i < data.Length; i += 2) { string code = data[i]; string missionState = data[i + 1]; bool isValidState = Enum.TryParse(missionState, out State state); if (!isValidState) { continue; } IMission mission = new Mission(code, state); missions.Add(mission); } soldier = new Commando(id, firstName, lastName, salary, corps, missions); } } else if (soldierType == "Spy") { int codeNumber = int.Parse(data[4]); soldier = new Spy(codeNumber, id, firstName, lastName); } if (soldier != null) { Console.WriteLine(soldier); troops.Add(id, soldier); } } }