サブリストを持つツリー内の任意の要素の前と次の要素を見つけるにはどうすればよいですか?現在の要素の前後の要素を見つけるために、多くのレベルのツリーをトラバースする方法はありますか?
例
-
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しか知りません。
私が実際に使っている例は、サブカテゴリを含むことができるため、それ自体に再帰的な関連付けを持つカテゴリエンティティです。私がレベル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