У меня есть класс Product
для хранения конкретного экземпляра данного продукта.
У этого класса есть список связанных продуктов, которые похожи на основной продукт.
class Product
{
public string Name;
public double Rating;
public List<Product> RelatedProducts;
//...
public List<Product> GetTopRelatedProducts(int N)
{
// How to implement this method
// What I did so far(Bad code)
// 1- INFINITE RECURSION
// 2- Can not remember visited objects
var myList = new List<Product>();
foreach(Product prod in RelatedProducts)
{
myList.AddRange(prod.GetTopRelatedProducts(N));
}
return myList.Distinct().OrderByDescending(x => x.Rating).Take(N).ToList();
}
}
Я хочу определить метод в классе Product
, чтобы получить лучшие N
(наилучшие оценки) связанные продукты. Этот метод должен учитывать, что элементы в списке RelatedProducts
имеют тип Product
, и у них также есть свой собственный список RelatedProducts
. Поэтому я должен продолжать навигацию вложенного объекта до тех пор, пока все связанные продукты не будут достигнуты, а после этого возьмите верхний продукт N.
Я имею в виду, что решение не было бы просто this.RelatedProducts.OrderByDescending(x => x.Rating).Take(N);
Еще одна вещь, о которой нужно помнить: Два продукта могут быть взаимно связаны. Это означает, что продукт A может принадлежать RelatedProducts
списку продукта B и B также может принадлежать RelatedProducts
списку продуктов А.
Любое предложение, как решить эту проблему оптимальным образом?
Представьте, у меня есть миллионы продуктов для поддержки. Как можно рекурсивно перемещаться по всем связанным продуктам и распознавать уже посещенные?
Я отметил это как С# и Java, так как одна и та же логика может применяться к обоим языкам