【问题标题】:Convert flat to hierarchy list?将平面转换为层次结构列表?
【发布时间】:2016-10-20 10:27:37
【问题描述】:

我有两个表“CategoryGroup”和“Category”,它们在一个列表中返回数据。要求是将平面列表转换为层次列表,例如 CategoryGroup 包含相关类别。

请建议如何转换为层次结构列表?

 public class ProfileConditionGroup
{
    public Guid ConditionGroupGUID { get; set; }
    public string ConditionGroupName { get; set; }
    public List<ProfileConditionList> profileConditions { get; set; }
}

public class ProfileConditionList
{
    public string ConditionName { get; set; }
    public Nullable<Guid> ConditionGUID { get; set; }
    public string[] ThisConditionSelectedByProfileIDs { get; set; }
    public Nullable<Guid> ParentConditionGroupGUID { get; set; }
    public bool IsDefaultSelected { get; set; }
}

【问题讨论】:

  • items.GroupBy(x =&gt; x.CategoryGroup) ?
  • 请在 C# 中为这两个表提供类定义。
  • @Enigmativity : 更新后

标签: c# asp.net entity-framework entity-framework-6


【解决方案1】:

如果没有实际的具体返回类型,这实际上有点棘手,但如果您只是构建 Guid 值的树,我会采用以下方法。

鉴于此查询:

var query =
    from pcg in pcgs
    from pcl in pcg.profileConditions
    select new
    {
        pcg.ConditionGroupName,
        pcg.ConditionGroupGUID,
        pcl.ConditionName,
        pcl.ConditionGUID,
        pcl.ThisConditionSelectedByProfileIDs,
        pcl.ParentConditionGroupGUID,
        pcl.IsDefaultSelected,
    };

...我会这样做:

var lookup = query.ToLookup(x => x.ParentConditionGroupGUID);

Func<Guid?, Tree<Guid?>> build = null;
build = g =>
{
    var r = new Tree<Guid?>() { Value = g };
    r.AddRange(lookup[g].Select(x => build(x.ConditionGroupGUID)));
    return r;
};

现在你只需调用build(null),你就会得到Guid? 的树。如果您可以创建自己的输出类,您可以将函数更改为Func&lt;Guid?, Tree&lt;YourOutputClass&gt;&gt;

树需要这个类:

public class Tree<T> : List<Tree<T>>
{
    public T Value { get; set; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-06
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    相关资源
    最近更新 更多