c# - 如何查找特定类别 id c# 的分层树最后一个节点
问题描述
List<Categories> categories = new List<Categories>
{
new Categories { CatID = 1, CatName = "Computer, IT & Networking"},
new Categories { CatID = 2, CatName = "Computer & Servers"},
new Categories { CatID = 3, CatName = "Desktop PCs"},
new Categories { CatID = 4, CatName = "Servers"},
new Categories { CatID = 5, CatName = "Computer Parts & Components"},
new Categories { CatID = 6, CatName = "Harddrive"},
new Categories { CatID = 7, CatName = "CPUs"},
new Categories { CatID = 8, CatName = "Electronics"},
new Categories { CatID = 9, CatName = "Furniture"},
new Categories { CatID = 10, CatName = "RAM"},
new Categories { CatID = 11, CatName = "Harddrive"},
new Categories { CatID = 12, CatName = "Workbooks"},
new Categories { CatID = 13, CatName = "IBM Desktop"},
new Categories { CatID = 14, CatName = "HP Desktop"}
};
List<CategoriesMapping> categoriesMapping = new List<CategoriesMapping>
{
new CategoriesMapping { CategoriesMappingID = 1, CatID = 1, MapCatID = 2},
new CategoriesMapping { CategoriesMappingID = 2, CatID = 1, MapCatID = 5},
new CategoriesMapping { CategoriesMappingID = 3, CatID = 2, MapCatID = 3},
new CategoriesMapping { CategoriesMappingID = 4, CatID = 2, MapCatID = 4},
new CategoriesMapping { CategoriesMappingID = 5, CatID = 5, MapCatID = 6},
new CategoriesMapping { CategoriesMappingID = 6, CatID = 5, MapCatID = 7},
new CategoriesMapping { CategoriesMappingID = 7, CatID = 5, MapCatID = 10},
new CategoriesMapping { CategoriesMappingID = 8, CatID = 5, MapCatID = 11},
new CategoriesMapping { CategoriesMappingID = 9, CatID = 2, MapCatID = 12},
new CategoriesMapping { CategoriesMappingID = 10, CatID = 3, MapCatID = 13},
new CategoriesMapping { CategoriesMappingID = 11, CatID = 3, MapCatID = 14}
};
如何获取特定 CatID 的最后一个节点,例如在上面的代码中,如果我选择 CatID = 2,它应该只带回 CatID 4、12、13、14。它不应该返回其子类别 CatID 3,因为它也有 13 和 14 的节点。相反,它只返回 CatID 3 的子节点。
解决方案
我假设您正在尝试使用 linq 魔法来解决这个问题。不幸的是,在Jon Skeet 的这个答案中,您可以看到它非常不方便。
你可以试试这样的东西,但它会变得相当昂贵。
我的建议是创建一个新功能,例如
public List<int> GetNoDescendateCategoriesCategoryId(int categoryId) {
List<int> newCategories = new List<int>();
List<int> childCategories = this.categoriesMapping.Where(m => m.CatID == categoryId).Select(x=> x.MapCatID).ToList();
if(childCategories.Count == 0) {
return new List<int>() {categoryId};
}
foreach (int catId in childCategories ) {
newCategories.AddRange(GetNoDescendateCategoriesCategoryId(catId));
}
return newCategories;
}
您可以查看https://dotnetfiddle.net/1IbjOf作为示例。
推荐阅读
- highcharts - 在折线图上绘制圆圈
- java - 从不同于 GUI 的类更新 TextField
- javascript - TinyMCE 错误:“您的 API 密钥上未启用 advcode 企业插件。” 但我在任何地方都没有“advcode”插件
- python - Odoo 10 - 重载 Python 方法
- java - Spock + spring boot web - 获取异常消息
- java - 如何检查搜索框文本是否与链接匹配?
- python - 在 R Studio 中找不到 python lib .so 和 init spacy?
- python - TensorFlow:将 py_func 保存到 .pb 文件
- json - 嵌套资源相对于父级的 JSON API 标识符
- iot - 无需直接访问即可将代码更改部署到 IoT 设备