public void CompileCategories() { Categories.Clear(); Categories.TrimExcess(); Categories.Add(RootCategory); if (Category.HasParent) { Categories.AddOrReplace(Category.Parent); } foreach (ConquestCategory c in Profile.Where(CanDisplay).Select(s => new ConquestCategory(s.Conquest.Category ?? ConquestCategory.Default))) { Categories.AddOrReplace(c); foreach (var p in c.GetParents()) { Categories.AddOrReplace(p); } } var selectedParents = Category.GetParents().ToArray(); Categories.RemoveAll( c => { var parents = c.GetParents().ToArray(); if (parents.Length > 0) { if (parents.Length <= selectedParents.Length && c != Category && !parents.Contains(Category) && !selectedParents.Any(p => p == c || c.Parent == p)) { return(true); } if (parents.Length > selectedParents.Length && c.Parent != Category) { return(true); } } return(false); }); Categories.Sort((l, r) => Insensitive.Compare(l.FullName, r.FullName)); CategoryScrollMax = Math.Max(0, Categories.Count - 14); CategoryScroll = Math.Max(0, Math.Min(CategoryScrollMax, CategoryScroll)); }