Как мне найти предыдущий и следующий элемент любого данного элемента в дереве, которое имеет подсписки?
Пример
- A
1,1 АА
1.1.1 ААА
1.1.2 ВВВ
1.1.3 CCC
1,2 ДД
Как мне получить предыдущий и следующий идентификаторы 1.1.3 CCC? Я знаю только идентификатор CCC в данный момент.
Реальным примером, с которым я работаю, является объект Category, который имеет рекурсивную ассоциацию с самим собой, поскольку он может содержать подкатегории. Если я нахожусь в подкатегории уровня 3, я хотел бы знать идентификатор предыдущей и следующей категории.
В моем представлении (веб-странице) у меня есть список всех категорий. Когда я нажимаю на категорию, я знаю только ее собственный идентификатор, но хотел бы также получить предыдущий и следующий идентификатор.
Я использовал следующие методы, но они не работают, когда есть несколько уровней:
private void GetNextCategoryID(PagedData<ShowQuestionViewModel> questionsPaged)
{
List<Category> categories = db.Category.Where(y => y.parrent_id == null).ToList();
categories.Sort(new CompareCategory());
List<ShowCategoriesViewModel> scvm = Mapper.Map<List<Category>, List<ShowCategoriesViewModel>>(categories);
for (int i = 0; i < scvm.Count; i++)
{
if (scvm[i].category_id == questionsPaged.CategoryID)
{
if (scvm[i].SubCategories != null && scvm[i].SubCategories.Count > 0)
{
questionsPaged.NextCategory_ID = scvm[i].SubCategories.First().category_id;
break;
}
try
{
questionsPaged.NextCategory_ID = scvm[i + 1].category_id;
break;
}
catch (ArgumentOutOfRangeException ex)
{
questionsPaged.NextCategory_ID = 0;
break;
}
}
else if (scvm[i].SubCategories != null)
{
for (int q = 0; q < scvm[i].SubCategories.Count; q++)
{
if (scvm[i].SubCategories[q].category_id == questionsPaged.CategoryID)
{
try
{
questionsPaged.NextCategory_ID = scvm[i].SubCategories[q + 1].category_id;
break;
}
catch (ArgumentOutOfRangeException ex)
{
// Betyder at vi er kommet til den sidste kategori i rækken
// og at den endnu ikke har fundet en match
try
{
questionsPaged.NextCategory_ID = scvm[i + 1].category_id;
break;
}
catch (ArgumentOutOfRangeException eq)
{
// Dette betyder at den valgte underkategori kategori er den sidste i spørgeskemaet
questionsPaged.NextCategory_ID = 0;
break;
}
}
}
}
}
}
}
и
private void GetPreviousCategoryID(PagedData<ShowQuestionViewModel> questionsPaged)
{
List<Category> categories = db.Category.Where(y => y.parrent_id == null).ToList();
categories.Sort(new CompareCategory());
List<ShowCategoriesViewModel> scvm = Mapper.Map<List<Category>, List<ShowCategoriesViewModel>>(categories);
for (int i = scvm.Count - 1; i >= 0; i--)
{
if (scvm[i].category_id == questionsPaged.CategoryID)
{
try
{
if (scvm[i - 1].SubCategories != null)
{
int subcount = scvm[i - 1].SubCategories.Count;
questionsPaged.PreviousCategory_ID = scvm[i - 1].SubCategories[subcount - 1].category_id;
break;
}
else
{
questionsPaged.PreviousCategory_ID = scvm[i - 1].category_id;
}
}
catch (ArgumentOutOfRangeException ex)
{
questionsPaged.CategoryID = scvm[i].category_id;
break;
}
}
else if (scvm[i].SubCategories != null)
{
for (int x = 0; x < scvm[i].SubCategories.Count; x++)
{
try
{
if (scvm[i].SubCategories[x].category_id == questionsPaged.CategoryID)
{
questionsPaged.PreviousCategory_ID = scvm[i].SubCategories[x - 1].category_id;
break;
}
}
catch (ArgumentOutOfRangeException qx)
{
questionsPaged.PreviousCategory_ID = scvm[i].category_id;
}
}
}
}
}
Спасибо!