我有一个系统,人们可以向我发送List<ProductCategory>
。
我需要对我的系统进行一些映射,然后将它们保存到数据库中。
传入的数据采用以下格式:
public string ExternalCategoryID { get; set; }
public string ExternalCategoryName { get; set; }
public string ExternalCategoryParentID { get; set; }
传入列表没有特别的顺序。如果ExternalCategoryParentID
为null,则这是顶级类别。父子关系可以是任何深度 - 即技术&gt;电视&gt;三星&gt; 3D&gt; 40“&gt;等&gt;等
当我保存时,我需要确保我已经保存了父母 - 在我保存技术之前我无法保存电视。 ExternalCategoryID
可能是一个int,但这与父子关系没有关系(父级的id可能高于或低于子级)。
我如何订购此列表,以便我可以遍历它并确保对于任何孩子,我已经处理过它的父母。
我能想到的唯一方法就是让所有ExternalCategoryParentID == null
到达ExternalCategoryParentID
所在的“最高级别”列表,然后获取下一组孩子...等等但这不是最好的解决方案。我更喜欢先排序,然后有一个循环来处理。我找到了this帖子,但它依赖createdDate
这与我无关。
答案 0 :(得分:1)
事实证明这并不是那么困难。我写了这个函数来做 - 你传入原始列表,它将返回一个排序列表。
通过循环检查列表中是否有id == current items parentid
列表中的任何项目来工作。如果有,我们会忽略该项目并继续。如果没有,我们将当前项添加到sortedList
并将其从原始列表中删除并继续。这可确保项目在其父项之后插入排序列表中。
private List<HeisenbergProdMarketplaceCategory> SortByParentChildRelationship(List<HeisenbergProdMarketplaceCategory> heisenbergMarketplaceCategories)
{
List<HeisenbergProdMarketplaceCategory> sortedList = new List<HeisenbergProdMarketplaceCategory>();
//we can check that a category doesn't have a parent in the same list - if it does, leave it and continue
//eventually the list will be empty
while(heisenbergMarketplaceCategories.Count > 0)
{
for (int i = heisenbergMarketplaceCategories.Count-1; i >= 0; i--)
{
if (heisenbergMarketplaceCategories.SingleOrDefault(p => p.ExternalCategoryID == heisenbergMarketplaceCategories[i].ExternalCategoryParentID) == null)
{
sortedList.Add(heisenbergMarketplaceCategories[i]);
heisenbergMarketplaceCategories.RemoveAt(i);
}
}
}
return sortedList;
}