c#:自引用对象转换
c#: Self referencing object conversion
我有一个自引用对象,我需要将其从一个对象转换为另一个相似的对象。我无法找到合适的方法来进行递归转换而不导致无限循环。任何帮助都是 appreciated.Still 学习我在 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;
}
如果我正确理解了user2368215的逻辑,原题中的代码应该不会死循环。但是,如果循环引用是可能的,则有一种简单的方法来检测和避免无限循环,方法是在 ToCommentRepo(...) 外部声明 Dictionary 并在每次创建新的 CommentRepo 对象时添加从 Comment 到 CommentRepo 到该字典的新映射.然后,在 ToCommentRepo(...) 方法的开头,只需检查映射是否已经存在并 return 它,而不是调用 LINQ 方法来创建新映射。
我有一个自引用对象,我需要将其从一个对象转换为另一个相似的对象。我无法找到合适的方法来进行递归转换而不导致无限循环。任何帮助都是 appreciated.Still 学习我在 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;
}
如果我正确理解了user2368215的逻辑,原题中的代码应该不会死循环。但是,如果循环引用是可能的,则有一种简单的方法来检测和避免无限循环,方法是在 ToCommentRepo(...) 外部声明 Dictionary 并在每次创建新的 CommentRepo 对象时添加从 Comment 到 CommentRepo 到该字典的新映射.然后,在 ToCommentRepo(...) 方法的开头,只需检查映射是否已经存在并 return 它,而不是调用 LINQ 方法来创建新映射。