使用C#/ LINQ基于parent_id的分层列表

时间:2015-12-05 15:19:29

标签: c# entity-framework linq

我有以下列表:

 List<CommentWithUser> flattened = new List<CommentWithUser>();

班级:

public class CommentWithUser
{
   public comment Comment { get; set; }
   public user User { get; set; }
}

我希望能够创建一个结构化的层次结构列表,其中每个注释都在其parent_id注释下。

我尝试使用this extension class但没有成功,也不知道如何从这一点开始。

她是comment班级:

public partial class comment
{
    public decimal id { get; set; }

    public long user_id { get; set; }
    public System.DateTime created { get; set; }
    public byte status_id { get; set; }
    public long reply_to_user_id { get; set; }
    public Nullable<decimal> parent_comment_id { get; set; }
    public string content { get; set; }
    public int spam_reports { get; set; }
    public Nullable<decimal> root_id { get; set; }
}

注意:注释是多线程=超过两个级别的结构。 使用:ASP.NET 4.5 / C#/ Entity Framework 6

1 个答案:

答案 0 :(得分:1)

这样的东西?

public class CommentWithUserNode
{
    public CommentWithUser Item { get; set; }
    public List<CommentWithUserNode> Children { get; set; }
}

static List<CommentWithUserNode> ToHierarchical(IEnumerable<CommentWithUser> source)
{
    var itemById = source.ToDictionary(
        item => item.Comment.id, 
        item => new CommentWithUserNode { Item = item, Children = new List<CommentWithUserNode>() } 
    );
    var rootItems = new List<CommentWithUserNode>();
    foreach (var node in itemById.Values)
    {
        CommentWithUserNode parentNode;
        if (node.Item.Comment.parent_comment_id == null)
            rootItems.Add(node);
        else if (itemById.TryGetValue(node.Item.Comment.parent_comment_id.Value, out parentNode))
            parentNode.Children.Add(node);
    }
    return rootItems;
}