为了演示这里发生了什么,我创建了这个Dot Net Fiddle
var list = new List<Category>()
{
new Category() { Id = 1, TitleEN = "Category 1" },
new Category() { Id = 2, TitleEN = "Category 2", ParentCategoryId = 1 },
new Category() { Id = 3, TitleEN = "Category 3", ParentCategoryId = 2 },
new Category() { Id = 4, TitleEN = "Category 4" },
new Category() { Id = 5, TitleEN = "Category 5" }
};
这对于通过Id获取我的模型的Child categories
非常有效。
var children = GetChildrenCategories(list, 1);
输出Category 2
Category 3
现在我需要完成相反的事情。如何通过Id获取Parent Categories
?
var children = GetParentCategories(list, 3);
应该导致
Category 1
Category 2
我建议在这里使用DFS示例
public static void GetParentsCategories(IEnumerable<Category> entities, List<string> parents, int? nodeId = null)
{
var currentNode = entities.Where(x => x.Id == nodeId).FirstOrDefault();
if (currentNode == null)
return;
var parent = entities.Where(x => x.Id == currentNode.ParentCategoryId).FirstOrDefault();
if (parent == null)
return;
parents.Add(parent.TitleEN);
GetParentsCategories(entities, parents, parent.Id);
}
在调用后将parents作为参数传递,您可以检查结果。
在这里编辑另一个带有迭代器的版本:
public static IEnumerable<string> GetParentsCategories(IEnumerable<Category> entities, int? nodeId = null)
{
var currentNode = entities.Where(x => x.Id == nodeId).FirstOrDefault();
var parent = entities.Where(x => x.Id == currentNode.ParentCategoryId).FirstOrDefault();
if (parent == null)
yield break;
yield return parent.TitleEN;
foreach (var trail in GetParentsCategories(entities, parent.Id))
yield return (trail);
}