2015-06-07 4 views
-3

У меня есть объект самореференции, который мне нужно преобразовать из одного в другой объект, который аналогичен. Я не могу найти подходящий метод для преобразования с рекурсией без перехода в бесконечный цикл. Любая помощь будет appreciated.Still обучения моих веревок в C#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

Что здесь означает «иссякновение»? Если у вас есть рабочий ToCommentRepo(), он должен работать. –

+0

Это не похоже, что у вас есть какие-либо циклические ссылки в вашем примере, поэтому вы не должны получать бесконечный цикл, если у вас нет элементов в коллекции Replies, содержащих исходный комментарий, но это не должно быть случай, правильно? –

+0

@ Денис Ярковой, Упс справа. У меня было несколько циркулярных ссылок, которые взорвались. Спасибо за вашу помощь и время. – user2368215

ответ

1

Код в исходном вопросе не должен приводить к бесконечному циклу, если я правильно понимаю логику user2368215. Однако, если круговые ссылки возможны, существует простой способ обнаружения и предотвращения бесконечных циклов путем объявления Словаря вне ToCommentRepo (...) и добавления нового сопоставления из комментария в CommentRepo в этот словарь каждый раз, когда создается новый объект CommentRepo , Затем в начале метода ToCommentRepo (...) просто проверьте, существует ли уже существующее сопоставление, и верните его, вместо вызова метода LINQ для создания нового сопоставления.