如何使用c#获得父类别?(包括Dot Net Fiddle)



为了演示这里发生了什么,我创建了这个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);
}

最新更新