c#:自引用对象转换

时间:2015-06-07 10:50:16

标签: c# converter infinite-loop self-reference

我有一个自引用对象,我需要将其从一个对象转换为另一个类似的对象。我无法找到合适的方法来进行递归转换而不会导致无限循环。任何帮助都会受到赞赏。还可以在c#中学习我的绳索。

对象1:

public class Comment
{
    public string User{ get; set; }
    public List<Comment> Replies { get; set; }
}

对象2:

public class CommentRepo
{
    public string User{ get; set; }
    public ICollection<CommentRepo> Replies { get; set; }
}

我将对象设置如下:

  var comment = new Shared.Models.Comment
        {
            User = "Test User"
        };


        var reply1 = new Shared.Models.Comment
        {
            User = "Reply User 1"
        };

        var subreply1 = new Shared.Models.Comment
        {

            User = "Sub Reply User 1"
        };

        var sublist = new List<Shared.Models.Comment>() { subreply1 };

        reply1.Replies = sublist;

        var reply2 = new Shared.Models.Comment
        {
            User = "Reply User 2"
        };

        var listed = new List<Shared.Models.Comment>() {reply1, reply2};


        comment.Replies = listed;

转换方法:这是我耗尽蒸汽的地方。

    public ICollection<CommentRepo> ToCommentRepo(IEnumerable<Shared.Models.Comment> comments)
    {
        if (comments == null) return null;

        var commentRepo = comments.Select(entity => new CommentRepo
        {
            User = entity.User,
            Replies = entity.Replies.Count > 0 ? ToCommentRepo(entity.Replies) : null,
        }).ToList();

        return commentRepo;
    }

1 个答案:

答案 0 :(得分:1)

如果我正确理解user2368215的逻辑,原始问题中的代码不应导致无限循环。但是,如果循环引用是可能的,有一种简单的方法可以通过在ToCommentRepo(...)之外声明Dictionary来检测和避免无限循环,并在每次创建新的CommentRepo对象时将Comment的Comment映射到CommentRepo添加到此字典中。然后,在ToCommentRepo(...)方法的开头,只需检查映射是否已存在并返回它,而不是调用LINQ方法来创建新的映射。