如何找到具有子列表的樹中任何給定元素的上一個元素和下一個元素?如何遍歷具有多個級別的樹來查找當前元素的上一個元素和下一個元素?
例
- 甲
1.1 AA
1.1.1 AAA
1.1.2 BBB
1.1.3 CCC
1.2 DD
如何獲取1.1.3 CCC的上一個和下一個ID?我只知道CCC在給定時刻的ID。
我正在使用的真實例子是一個Category實體,它具有遞歸關聯,因爲它可以包含SubCategories。如果我處於3級子類別,我想知道上一個和下一個類別的ID。
在我的查看(網頁)我有一個所有類別的列表。當我點擊一個類別時,我只知道它是自己的ID,但想要獲得上一個和下一個ID。
我用下面的方法,但他們不工作時,有沒有更多的層次:
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;
}
}
}
}
}
謝謝!
那麼樹節點擁有一個類別,每個節點可以有任意數量的子對嗎? – Tudor
是的,這是正確的 – Kenci