Добавление объекта в список - это бесконечно рекурсивное добавление этого объекта. - PullRequest
0 голосов
/ 29 апреля 2020

Я решил этот вопрос, создав глубокую копию объекта. Но мне нужно понять, что происходит ... почему он добавляет и бесконечный объект l oop внутри себя, если не использует Deep Copy.

Вопрос:

  • childProduct и parentProduct - это класс NewProduct, в котором в качестве свойства указано «ChildProducts»;
  • Я пометил в коде цифры 1 и 2;
  • 1 - parentProduct.ChildProducts очищен;
  • 2 Где волхвы c. Когда он добавляет childProducts в список parentProduct.ChildProducts, он создает бесконечно l oop с собой внутри себя (один и тот же объект внутри самого поля ChildProducts) ... и так далее ... Это вызывало у меня исключение stackoverflow, когда мне было нужно в l oop это поле ... но когда я добавил .Clone () он прекратил создавать эту рекурсивную вставку.

ПОЧЕМУ?

public class NewProduct {
 public int Id { get; set; }
 public string Name { get; set; }
 public List<NewProduct> ChildProducts { get; set; }
}

public List<NewProduct> BuildParentProductsBasedOnChildrenProducts(List<NewProduct> allProducts) {
 var childProducts = allProducts.FindAll(prod => prod.IsChildProduct);
 var parentProducts = new List<NewProduct>();

 foreach (var childProduct in childProducts) {
   var parentProduct = allProducts.Find(prod => prod.ProductIdSku == childProduct.VariationId);
   if (parentProduct != null)
     {
       parentProduct.ChildProducts.RemoveAll(); **<<<<< 1**
       parentProduct.ChildProducts.Add(childProduct.Clone()); **<<<<<<< 2**
       parentProducts.Add(parentProduct);
     }


 }
 return parentProducts;
}


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...