Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用不同类型的对象填充列表_C#_Wrapper - Fatal编程技术网

C# 使用不同类型的对象填充列表

C# 使用不同类型的对象填充列表,c#,wrapper,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; s

我正在研究一种推荐算法,一切都很好。但是现在我想在我的开发团队中实现这段代码

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

餐厅:

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 RecommenderItem
{
    public Restaurant rest { get; set; }
    public Dish dish { get; set; }
}
这样我就可以创建一个
列表
,并将其返回给客户端。客户机只需要检查哪个属性为null,并从哪个属性为null的属性中检索值


我只是不确定这是否是正确的方法。在这方面有什么“最佳实践”吗?让我知道我是否应该详细说明

如果它们没有公共基类,那么创建一个包装类是最好的解决方案。同时,你可以更灵活地创建类似

public class RecommendationItem
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string PageUrl { get; set; }
    public object Entity { get; set; }
}

所以,您可以在这个类中包含所有公共信息,而不需要客户机检查他使用的对象类型。在这种情况下,添加一个以上的项目类型会更容易。在同一类型中,我添加了对实体本身的引用-如果需要对一个或两个项目类型进行某些特定处理,则可以使用它。

如果要连接成对的元素,我始终认为。。。好吧,把元素配对。我假设每道菜都是特定于某家餐厅的?那么名单应该是[餐厅1][disk for Restaurant1][Restaurant2][disk for Restaurant2]

我喜欢前面的答案,oryol也创建了一个公共基类


所以,你的推荐课很好。但是,填写这两个属性并将一个对列表传递回。通过创建一个新的列表,遍历推荐项列表,并从列表中的每个条目添加餐厅和菜肴,将列表扩展到完整的显示项目集。

您可以声明一个接口IRecommenderItem:

public interface IRecommenderItem
{
    //shared properties
}

public class Restaurant : IRecommenderItem
{

}

public class Dish : IRecommenderItem
{

}
然后,您可以键入:

List<IRecommenderItem> m = new List<IRecommenderItem>();
List m=新列表();

就我个人而言,我会让这两个类实现一个接口,该接口公开共享属性,例如
Id
Name
(以及
标记
),并创建该接口的列表(该接口还可以公开一个“
类型
”,用于替代)
RecommenderItem
对我来说似乎是一个正确的解决方案,因为它似乎是一个菜品列表,每个菜品都与餐厅相关。您的返回类型应该反映这一点,这取决于您如何生成显示信息。e、 g.ToString()可以返回所有相关信息,或者接口可以公开类似“ListProperties”@Bas-Ah的内容,好的。很抱歉尽管如此,将一个属性或另一个属性设置为null也很好。通常比任何东西都可能在其中的
列表要好——除非UI允许您使用某种数据模板机制,在这种机制中它将动态选择正确的模板来显示项目。然后使用
列表
,或
列表
。我想把你的例子改成
[餐厅][菜肴][餐厅][餐厅][菜肴]
或者其他一些明确的例子。(除了我之外,没人没听懂你的意思,所以也许你很好!)@EdPlunkett好吧,这正是我的产品负责人想要的。我将添加一个描述来更好地解释它。啊,所以我必须检查哪个类型<代码>实体并相应地使用它?尽管它们不是成对的。菜式和餐厅是完全分开的。我的算法纯粹根据用户提供的信息生成这些建议。我的产品所有者只想在用户的主页上替换类型。啊!这就是我事后的猜测!
public interface IRecommenderItem
{
    //shared properties
}

public class Restaurant : IRecommenderItem
{

}

public class Dish : IRecommenderItem
{

}
List<IRecommenderItem> m = new List<IRecommenderItem>();