/// <summary>
 /// Gets a list of the Templates in the Collection
 /// </summary>
 /// <param name="templateType">Optionally filter only templates of a type</param>
 /// <returns>List of the Templates</returns>
 public List <Template> List(Type templateType = null)
 {
     return(DatabaseItems.Select(dbitem => dbitem.Value)
            .OrderBy(template => template.ID)
            .Where(template => templateType == null || template.GetType() == templateType || template.GetType().IsSubclassOf(templateType))
            .ToList());
 }
 /// <summary>
 /// Gets the highest ID in the Collection + 1
 /// </summary>
 /// <returns>The ID</returns>
 private int GetNextID()
 {
     if (DatabaseItems.Count == 0)
     {
         return(0);
     }
     return(DatabaseItems.Max(item => item.Key) + 1);
 }
 /// <summary>
 /// Removes a Template from the Collection if it exists
 /// </summary>
 /// <param name="template">The Template to remove</param>
 public void Remove(Template template)
 {
     try
     {
         var record = DatabaseItems.First(t => t.Value.ID == template.ID);
         DatabaseItems.Remove(record.Key);
     }
     catch (InvalidOperationException)
     {
         Debug.Log($"Template ID {template.ID} Not Found");
     }
 }
 /// <summary>
 /// Gets a Template by TemplateName
 /// </summary>
 /// <param name="name">The TemplateName</param>
 /// <returns>The Template or null if not found</returns>
 public Template Get(string name)
 {
     return(DatabaseItems
            .Select(item => item.Value)
            .FirstOrDefault(item => item.Name.Equals(name)));
 }
 /// <summary>
 /// Gets a Template by ID
 /// </summary>
 /// <param name="id"></param>
 /// <returns>The Template or null if not found</returns>
 public Template Get(int id)
 {
     return(DatabaseItems
            .Select(item => item.Value)
            .FirstOrDefault(item => item.ID == id));
 }