using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Text; namespace Model { /// /// Define a collection of . ///
This class implement and . ///
public class RecipeCollection : IList, IEquatable { #region Attributes private readonly List _recipes; private string _description = ""; #endregion #region Properties /// /// A short description of what this collection contain.
/// Set to "No description." when the value passed is null, empty or contain white spaces. ///
public string Description { get => _description; set { if (string.IsNullOrWhiteSpace(value)) _description = "No description."; else _description = value; } } #region IList Prperties public int Count => _recipes.Count; public bool IsReadOnly => false; public Recipe this[int index] { get => _recipes[index]; set => _recipes[index] = value; } #endregion #endregion #region Constructors /// /// Construct a new collection of _recipes. /// /// A short description of what this list will contain /// Recipes to add in this new collection public RecipeCollection(string description, params Recipe[] recipes) { _recipes = new List(recipes); Description = description; } #endregion #region Methods /// /// Find a recipe in this list by giving the id. /// /// The id of the list we are looking for /// The recipe of the id given /// public Recipe? GetRecipeById(int id) { Recipe? recipe = _recipes.Find(r => r.Id == id); if (recipe == null) throw new ArgumentException("No _recipes match the given id."); return recipe; } public RecipeCollection ResearchByName(string str) { return new RecipeCollection( description: $"Results of the research: {str}", recipes: _recipes.FindAll(x => x.Title.ToLower().Contains(str.ToLower())).ToArray()); } #region IList Methods public int IndexOf(Recipe item) { return _recipes.IndexOf(item); } public void Insert(int index, Recipe item) { _recipes.Insert(index, item); } public void RemoveAt(int index) { _recipes.RemoveAt(index); } public void Add(Recipe item) { _recipes.Add(item); } public void Clear() { _recipes.Clear(); } public bool Contains(Recipe item) { return _recipes.Contains(item); } public void CopyTo(Recipe[] array, int arrayIndex) { _recipes.CopyTo(array, arrayIndex); } public bool Remove(Recipe item) { return _recipes.Remove(item); } public IEnumerator GetEnumerator() { return _recipes.GetEnumerator(); } IEnumerator IEnumerable.GetEnumerator() { return _recipes.GetEnumerator(); } #endregion public virtual bool Equals(RecipeCollection? other) { if (other == null) return false; if (other == this) return true; return _description.Equals(other.Description) && _recipes.Equals(other._recipes); } public override bool Equals(object? obj) { var item = obj as RecipeCollection; if (item == null) return false; return Equals(obj); } public override int GetHashCode() { return _recipes.GetHashCode(); } public override string ToString() { StringBuilder sb = new StringBuilder($"[RecipeCollection] - {Description}:\n"); foreach (Recipe r in _recipes) { sb.AppendFormat("\t - {0}\n", r.ToString()); } return sb.ToString(); } #endregion } }