我正在研究推荐算法,一切正常。但现在我想将此代码实现到我的开发团队的分支中。
我将从顶部开始。我的算法可以推荐两种类型的对象,餐馆和菜肴。
餐厅:
public class Restaurant
{
public Guid Id { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
public List<Tag> Tags { get; set; } = new List<Tag>();
public int PriceRange { get; set; }
}
菜:
public class Dish
{
public Guid Id { get; set; }
public string Name { get; set; }
public double Price { get; set; }
public virtual Restaurant rest { get; set; }
[ForeignKey("rest")]
public Guid RestaurantId { get; set; }
public List<Tag> Tags { get; set; }
}
现在我的产品所有者希望列表在我们应用的主页上显示时是这样的:
[Restaurant][Dish][Restaurant][Dish] Etc...
基本上,他想要改变推荐的对象类型。这些菜肴和餐厅完全分开。它们完全根据用户的偏好由我的算法生成,并且完全没有相互关联。
现在我的问题是如何返回这样的列表。我想我需要一个包含Restaurant
或Dish
的包装类,如下所示:
public class RecommenderItem
{
public Restaurant rest { get; set; }
public Dish dish { get; set; }
}
这样我就可以创建一个List<RecommenderItem>
并将其返回给客户端。客户端只需要检查哪个属性为null,并从非该属性中检索值。
我只是不确定这是否是正确的做法。这样做有“最佳实践”吗?让我知道我是否应该详细说明!
答案 0 :(得分:2)
如果他们没有共同的基类,那么创建一个包装类是最好的解决方案。与此同时,您可以更灵活地创建类似
的内容public class RecommendationItem
{
public Guid Id { get; set; }
public string Name { get; set; }
public string PageUrl { get; set; }
public object Entity { get; set; }
}
因此,您可以在此类中包含所有常用信息,并且不需要客户端检查他使用的对象类型。在这种情况下,添加一个项目类型会更容易。在同一类型中,我添加了对实体本身的引用 - 如果需要对一个或两个项目类型进行某些特定处理,则可以使用它。
答案 1 :(得分:1)
您可以声明一个接口IRecommenderItem:
public interface IRecommenderItem
{
//shared properties
}
public class Restaurant : IRecommenderItem
{
}
public class Dish : IRecommenderItem
{
}
,你可以输入:
List<IRecommenderItem> m = new List<IRecommenderItem>();
答案 2 :(得分:0)
如果要连接成对元素,我总是有意义......好吧,配对元素。我假设每道菜都是特定的餐厅?所以列表将是[餐厅1] [餐厅1的菜] [餐厅2] [餐厅2的菜] ...?
我喜欢oryol之前的回答,也可以创建一个公共基类。
所以,你的RecommenderItem类很好。但是填写两个属性并传回一对对列表。通过创建新List,遍历RecommenderItems列表并从其中的每个条目添加Restaurant和Dish,将列表展开为要显示的完整项目集。