用不同类型的对象填充列表
Filling list with different types of objects
我正在研究一种一切正常的推荐算法。但是现在我想把这段代码实现到我的开发团队的分支中。
我将从头开始。我的算法可以推荐两种类型的对象,餐厅和菜肴。
餐厅:
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...
基本上,他想更换推荐的对象类型。这些菜肴和餐厅是完全分开的。它们是我的算法纯粹根据用户的喜好生成的,彼此之间完全没有关联。
现在我的问题是如何return这样一个列表。我想我需要一个包含 Restaurant
或 Dish
的包装器 class,如下所示:
public class RecommenderItem
{
public Restaurant rest { get; set; }
public Dish dish { get; set; }
}
这样我可以为客户创建一个 List<RecommenderItem>
和 return。客户端只需要检查哪个属性为 null 并从不是 null 的属性中检索值。
我只是不确定这是否是正确的方法。这样做有什么'best practices'吗?让我知道是否应该详细说明!
如果他们没有共同的基础 class 那么创建一个包装器 class 是最好的解决方案。同时你可以更灵活地创建类似
的东西
public class RecommendationItem
{
public Guid Id { get; set; }
public string Name { get; set; }
public string PageUrl { get; set; }
public object Entity { get; set; }
}
因此您可以在此 class 中包含所有常用信息,并且客户不需要检查他使用的对象类型。在这种情况下,再添加一种项目类型会更容易。在同一类型中,我添加了对实体本身的引用 - 如果需要对一种或两种项目类型进行某些特定处理,则可以使用它。
如果你要连接成对的元素,对我来说总是有意义的......好吧,将元素配对。我假设每道菜都是特定于特定餐厅的?所以列表将是 [Restaurant1][Restaurant1 的菜肴][Restaurant2][Restaurant2 的菜肴]...?
我也喜欢 oryol 创建一个公共基础 class 之前的回答。
因此,您的 RecommenderItem class 没问题。但是填写这两个属性并返回一个对列表。通过创建新列表、遍历 RecommenderItems 列表并从其中的每个条目添加 Restaurant 和 Dish,将列表扩展为完整的项目集以供显示。
您可以声明一个接口 IRecommenderItem:
public interface IRecommenderItem
{
//shared properties
}
public class Restaurant : IRecommenderItem
{
}
public class Dish : IRecommenderItem
{
}
比,你可以输入:
List<IRecommenderItem> m = new List<IRecommenderItem>();
我正在研究一种一切正常的推荐算法。但是现在我想把这段代码实现到我的开发团队的分支中。
我将从头开始。我的算法可以推荐两种类型的对象,餐厅和菜肴。
餐厅:
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...
基本上,他想更换推荐的对象类型。这些菜肴和餐厅是完全分开的。它们是我的算法纯粹根据用户的喜好生成的,彼此之间完全没有关联。
现在我的问题是如何return这样一个列表。我想我需要一个包含 Restaurant
或 Dish
的包装器 class,如下所示:
public class RecommenderItem
{
public Restaurant rest { get; set; }
public Dish dish { get; set; }
}
这样我可以为客户创建一个 List<RecommenderItem>
和 return。客户端只需要检查哪个属性为 null 并从不是 null 的属性中检索值。
我只是不确定这是否是正确的方法。这样做有什么'best practices'吗?让我知道是否应该详细说明!
如果他们没有共同的基础 class 那么创建一个包装器 class 是最好的解决方案。同时你可以更灵活地创建类似
的东西public class RecommendationItem
{
public Guid Id { get; set; }
public string Name { get; set; }
public string PageUrl { get; set; }
public object Entity { get; set; }
}
因此您可以在此 class 中包含所有常用信息,并且客户不需要检查他使用的对象类型。在这种情况下,再添加一种项目类型会更容易。在同一类型中,我添加了对实体本身的引用 - 如果需要对一种或两种项目类型进行某些特定处理,则可以使用它。
如果你要连接成对的元素,对我来说总是有意义的......好吧,将元素配对。我假设每道菜都是特定于特定餐厅的?所以列表将是 [Restaurant1][Restaurant1 的菜肴][Restaurant2][Restaurant2 的菜肴]...?
我也喜欢 oryol 创建一个公共基础 class 之前的回答。
因此,您的 RecommenderItem class 没问题。但是填写这两个属性并返回一个对列表。通过创建新列表、遍历 RecommenderItems 列表并从其中的每个条目添加 Restaurant 和 Dish,将列表扩展为完整的项目集以供显示。
您可以声明一个接口 IRecommenderItem:
public interface IRecommenderItem
{
//shared properties
}
public class Restaurant : IRecommenderItem
{
}
public class Dish : IRecommenderItem
{
}
比,你可以输入:
List<IRecommenderItem> m = new List<IRecommenderItem>();