我有一个自引用对象,我需要将其从一个对象转换为另一个类似的对象。我无法找到合适的方法来进行递归转换而不会导致无限循环。任何帮助都会受到赞赏。还可以在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;
}
答案 0 :(得分:1)
如果我正确理解user2368215的逻辑,原始问题中的代码不应导致无限循环。但是,如果循环引用是可能的,有一种简单的方法可以通过在ToCommentRepo(...)之外声明Dictionary来检测和避免无限循环,并在每次创建新的CommentRepo对象时将Comment的Comment映射到CommentRepo添加到此字典中。然后,在ToCommentRepo(...)方法的开头,只需检查映射是否已存在并返回它,而不是调用LINQ方法来创建新的映射。