通过父/子关系对列表进行排序,因此在尝试处理子项之前,我确实已经处理了父项

时间:2016-08-24 06:24:29

标签: c# linq sorting

我有一个系统,人们可以向我发送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这与我无关。

1 个答案:

答案 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;
}