static void Main(string[] args) { var familyTree = new List <Person>(); string personInput = Console.ReadLine(); Person mainPerson = new Person(); if (IsBirthday(personInput)) { mainPerson.Birthday = personInput; } else { mainPerson.Name = personInput; } familyTree.Add(mainPerson); string command; while ((command = Console.ReadLine()) != "End") { string[] tokens = command.Split(" - "); if (tokens.Length > 1) { string firstPerson = tokens[0]; string secondPerson = tokens[1]; Person currentPerson; if (IsBirthday(firstPerson)) { currentPerson = familyTree.FirstOrDefault(p => p.Birthday == firstPerson); if (currentPerson == null) { currentPerson = new Person(); currentPerson.Birthday = firstPerson; familyTree.Add(currentPerson); } SetChild(familyTree, currentPerson, secondPerson); } else { currentPerson = familyTree.FirstOrDefault(p => p.Name == firstPerson); if (currentPerson == null) { currentPerson = new Person(); currentPerson.Name = firstPerson; familyTree.Add(currentPerson); } SetChild(familyTree, currentPerson, secondPerson); } } else { tokens = tokens[0].Split(); string name = $"{tokens[0]} {tokens[1]}"; string birthday = tokens[2]; var person = familyTree.FirstOrDefault(p => p.Name == name || p.Birthday == birthday); if (person == null) { person = new Person(); familyTree.Add(person); } person.Name = name; person.Birthday = birthday; int index = familyTree.IndexOf(person) + 1; int count = familyTree.Count - index; Person[] copy = new Person[count]; familyTree.CopyTo(index, copy, 0, count); Person copyPerson = copy.FirstOrDefault(p => p.Name == name || p.Birthday == birthday); if (copyPerson != null) { familyTree.Remove(copyPerson); person.Parents.AddRange(copyPerson.Parents); person.Parents = person.Parents.Distinct().ToList(); person.Children.AddRange(copyPerson.Children); person.Children = person.Children.Distinct().ToList(); } } } Print(mainPerson); }