填充列表与不同类型的对象

时间:2016-12-13 14:54:42

标签: c# wrapper

我正在研究推荐算法,一切正常。但现在我想将此代码实现到我的开发团队的分支中。

我将从顶部开始。我的算法可以推荐两种类型的对象,餐馆和菜肴。

餐厅:

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...

基本上,他想要改变推荐的对象类型。这些菜肴和餐厅完全分开。它们完全根据用户的偏好由我的算法生成,并且完全没有相互关联。

现在我的问题是如何返回这样的列表。我想我需要一个包含RestaurantDish的包装类,如下所示:

public class RecommenderItem
{
    public Restaurant rest { get; set; }
    public Dish dish { get; set; }
}

这样我就可以创建一个List<RecommenderItem>并将其返回给客户端。客户端只需要检查哪个属性为null,并从非该属性中检索值。

我只是不确定这是否是正确的做法。这样做有“最佳实践”吗?让我知道我是否应该详细说明!

3 个答案:

答案 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,将列表展开为要显示的完整项目集。

相关问题