// Get all the possible variations for a given course, based on the loops/forks. Returns a list of VariationInfo, // giving the code string, VariationPath, and name. Sorted by code string. public static IEnumerable<VariationInfo> GetAllVariations(EventDB eventDB, Id<Course> courseId) { HashSet<Id<CourseControl>> alreadyVisited = new HashSet<PurplePen.Id<PurplePen.CourseControl>>(); CourseDesignator courseDesignator = new CourseDesignator(courseId); Dictionary<Id<CourseControl>, char> variationMapper = GetVariantCodeMapping(eventDB, courseDesignator); List<List<Id<CourseControl>>> variations = GetVariations(eventDB, courseDesignator, eventDB.GetCourse(courseId).firstCourseControl, alreadyVisited); List<VariationInfo> result = new List<VariationInfo>(); // Check for no variations. if (variations.Count == 1 && variations[0].Count == 0) return result; foreach (var choices in variations) { string variationString = GetVariationString(eventDB, choices, variationMapper); VariationInfo.VariationPath variationPath = new VariationInfo.VariationPath(choices); result.Add(new VariationInfo(variationString, variationPath)); } result.Sort((vi1, vi2) => string.Compare(vi1.CodeString, vi2.CodeString, StringComparison.OrdinalIgnoreCase)); return result; }