using System.Collections.Generic;
using System.Collections.ObjectModel;
public static void Main()
var organization = SetUpExercise("X Corp");
Console.WriteLine("Write your code here...");
private static Organization SetUpExercise(string orgName)
var organization = new Organization(orgName);
var brickAndMortarOffice = new BrickAndMortarOffice("On Site Office");
for (var i = 0; i < 5; i++)
var employee = new Employee();
brickAndMortarOffice.AddEmployee(employee);
organization.AddOffice(brickAndMortarOffice);
var virtualOffice = new VirtualOffice("Remote Office");
for (var i = 0; i < 5; i++)
var employee = new Employee();
virtualOffice.AddEmployee(employee);
organization.AddOffice(virtualOffice);
public class Organization
private readonly IList<Office> _offices = new List<Office>();
public Organization(string name)
public string Name { get; set; }
public void AddOffice(Office office)
office.Name = $"{Name}: {office.Name}";
office.Organization = this;
public IReadOnlyCollection<Office> GetOffices()
return new ReadOnlyCollection<Office>(_offices);
public abstract class Office
private readonly IList<Employee> _employees = new List<Employee>();
protected Office(string name)
public string Name { get; set; }
public Organization Organization { get; set; }
public virtual void AddEmployee(Employee employee)
employee.Name = GetRandomName();
_employees.Add(employee);
public IReadOnlyCollection<Employee> GetEmployees()
return new ReadOnlyCollection<Employee>(_employees);
private static string GetRandomName()
IList<string> firstNames = new List<string> {"Peter", "Tony", "Sue", "Thor", "Victor", "Otto", "Stephen", "Norman", "Matt", "Scott"};
IList<string> lastNames = new List<string> {"Parker", "Stark", "Storm", "Odinson", "von Doom", "Octavius", "Strange", "Osborn", "Murdock", "Summers"};
var random = new Random();
return new string(firstNames[random.Next(firstNames.Count)] + " " + lastNames[random.Next(lastNames.Count)]);
public class BrickAndMortarOffice : Office
public BrickAndMortarOffice(string name) : base(name)
public class VirtualOffice : Office
public VirtualOffice(string name) : base(name)
private readonly IList<IssuedItem> _issuedItems = new List<IssuedItem>();
public string Name { get; set; }
public void AddIssuedItem(IssuedItem issuedItem)
_issuedItems.Add(issuedItem);
public IReadOnlyCollection<IssuedItem> GetIssuedItems()
return new ReadOnlyCollection<IssuedItem>(_issuedItems);
public abstract class IssuedItem
public string Name { get; set; }
public string Description { get; set; }
protected IssuedItem(string name, string description)
Description = description;
public class FaceMask : IssuedItem
public FaceMask() : base("Face Mask", "White surgical mask")
public class HandSanitizer : IssuedItem
public HandSanitizer() : base("Hand Sanitizer", "3 oz 75% alcohol hand sanitizer gel")
public class LaptopComputer : IssuedItem
public LaptopComputer() : base("Laptop Computer", "ThinkPad T480s")
public LaptopBag LapTopBag { get; } = new LaptopBag();
public class LaptopBag : IssuedItem
public LaptopBag() : base("Laptop Bag", "Vinyl Laptop Bag")