/// <summary> /// Removes a set of skill levels from this plan. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="skillsToRemove">The skill levels to remove.</param> /// <returns> /// An object allowing to perform and control the removal. /// </returns> public IPlanOperation TryRemoveSet <T>(IEnumerable <T> skillsToRemove) where T : ISkillLevel { IEnumerable <PlanEntry> allEntriesToRemove = GetAllEntriesToRemove(skillsToRemove); // Creates a plan where the entries and their dependencies have been removed PlanScratchpad freePlan = new PlanScratchpad(Character); freePlan.RebuildPlanFrom(Items); foreach (PlanEntry entry in allEntriesToRemove) { freePlan.Remove(entry); } // Gather removables prerequisites now useless List <PlanEntry> removablePrerequisites = new List <PlanEntry>(); foreach (PlanEntry prereqEntry in allEntriesToRemove.SelectMany( entryToRemove => Items.Where(entryToRemove.IsDependentOf).Where( prereq => freePlan.GetMinimumLevel(prereq.Skill) == 0).Select( prereq => freePlan.GetEntry(prereq.Skill, prereq.Level)).Where( prereqEntry => prereqEntry != null && prereqEntry.Type == PlanEntryType.Prerequisite))) { removablePrerequisites.Add(prereqEntry); freePlan.Remove(prereqEntry); } // Create the operation return(new PlanOperation(this, skillsToRemove.Cast <ISkillLevel>(), allEntriesToRemove, removablePrerequisites)); }