using System; using System.Collections.Generic; using System.Text; namespace Lab5.TouristInformationCenter { class MuseumsContainer { private Museum[] museums; private int Capacity; public int Count { get; private set; } public MuseumsContainer(int capacity = 16) { Capacity = capacity; museums = new Museum[capacity]; } public MuseumsContainer(MuseumsContainer container) : this(container.Capacity) { for (int i = 0; i < container.Count; i++) { Add(container.Get(i)); } } /// /// Add a museum to the end of the container /// /// Target museum public void Add(Museum museum) { if (Count == Capacity) { EnsureCapacity(Capacity * 2); } museums[Count] = museum; Count++; } /// /// Get a musem by index from container /// /// Target index /// Museum at given index public Museum Get(int index) { return museums[index]; } /// /// Check if given museum exists in container /// /// Target museum /// True if contains public bool Contains(Museum museum) { for (int i = 0; i < Count; i++) { if (museums[i].Equals(museum)) { return true; } } return false; } /// /// Put a museum at a specific index /// /// Target index /// Target museum public void Put(int index, Museum museum) { museums[index] = museum; } /// /// Filter by property "HasGuide" /// /// Target value /// A filtered container of museums public MuseumsContainer FilterByGuide(bool hasGuide) { MuseumsContainer filtered = new MuseumsContainer(); for (int i = 0; i < Count; i++) { Museum museum = museums[i]; if (museum.HasGuide == hasGuide) { filtered.Add(museum); } } return filtered; } /// /// Filter by property "Type". /// /// Target type /// A filtered container of museums public MuseumsContainer FilterByType(string type) { MuseumsContainer filtered = new MuseumsContainer(); for (int i = 0; i < Count; i++) { Museum museum = museums[i]; if (museum.Type == type) { filtered.Add(museum); } } return filtered; } /// /// Filter by property "Price". /// /// Maximum allowed price to be included /// A container with museums that dont't have a larger price then "maxPrice" public MuseumsContainer FilterByPrice(double maxPrice) { MuseumsContainer filtered = new MuseumsContainer(); for (int i = 0; i < Count; i++) { Museum museum = museums[i]; if (museum.Price <= maxPrice) { filtered.Add(museum); } } return filtered; } /// /// Filter by property "Type" /// /// Target city /// A container of museums public MuseumsContainer FilterByCity(string city) { MuseumsContainer filtered = new MuseumsContainer(); for (int i = 0; i < Count; i++) { Museum museum = museums[i]; if (museum.City == city) { filtered.Add(museum); } } return filtered; } /// /// Return a list of "active" museums from the contaner. /// A museum is considered active if it is working at least some amount a week. /// /// Threshold which determines what is active /// A container of "active" museums public MuseumsContainer FilterByActivity(int threshold) { MuseumsContainer filtered = new MuseumsContainer(); for (int i = 0; i < Count; i++) { Museum museum = museums[i]; if (museum.Workdays.Count >= threshold) { filtered.Add(museum); } } return filtered; } /// /// Filter by property "Name" /// /// Target name /// A filtered container public MuseumsContainer FilterByName(string name) { MuseumsContainer filtered = new MuseumsContainer(); for (int i = 0; i < Count; i++) { Museum museum = museums[i]; if (museum.Name == name) { filtered.Add(museum); } } return filtered; } /// /// Get all of the different types of cities. /// /// A list of city names public List GetAllCities() { List cities = new List(); for (int i = 0; i < Count; i++) { Museum museum = museums[i]; if (!cities.Contains(museum.City)) { cities.Add(museum.City); } } return cities; } /// /// Sort container by "City" and "Name" in alphabetical order. /// public void Sort() { for (int i = 0; i < Count - 1; i++) { for (int j = i + 1; j < Count; j++) { Museum a = museums[i]; Museum b = museums[j]; int nameCompare = a.Name.CompareTo(b.Name); int cityCompare = a.City.CompareTo(b.City); if (cityCompare > 0 || (cityCompare == 0 && nameCompare > 0)) { museums[i] = b; museums[j] = a; } } } } private void EnsureCapacity(int minimumCapacity) { if (minimumCapacity <= Capacity) return; Museum[] museumsClone = new Museum[minimumCapacity]; for (int i = 0; i < Count; i++) { museumsClone[i] = museums[i]; } Capacity = minimumCapacity; museums = museumsClone; } } }