public void RemoveSubCategories(IList list) { var itemsToDelete = new List <Item>(); var subCategoriesToDelete = list.Cast <SubCategory>().ToList(); foreach (var subCategory in subCategoriesToDelete) { itemsToDelete.AddRange( _shop.Items.Where( x => x.CategoryId == SelectedCategoryIndex && x.SubCategoryId == SubCategories.IndexOf(subCategory) ) ); } _shop.Items.RemoveRange(itemsToDelete); #region MoveItems var index = -1; for (int i = 0; i < _shop.Items.Count; i++) { if (_shop.Items[i].CategoryId == SelectedCategoryIndex) { index++; int subCat = _shop.Items[i].SubCategoryId; int j = i; for (; j < _shop.Items.Count; j++) { if (subCat == _shop.Items[j].SubCategoryId) { while (_shop.Items[j].SubCategoryId > index) { _shop.Items[j].SubCategoryId--; } } else { break; } } i = j - 1; } } #endregion _subCategories.RemoveRange(subCategoriesToDelete); NotifyOfPropertyChange(nameof(SubCategories)); NotifyOfPropertyChange(nameof(Items)); }