如何在C#中实现电影的导演和演员?

时间:2009-12-28 18:51:37

标签: c# .net

基本上,我会在每个Directors类型实例的xml中定义ActorsMovie列表。

  1. 我应该使用什么类型来定义集合? (Built-inBCL?)

  2. custom
  3. 我应该strings使用DirectorsActors还是定义特定的DirectorActor类型?

  4. 如果是(对于#2),我应该有一个Person类,DirectorActor来自。{/ p>

  5. 我对这种关系的模型不会像IMDb那样深。

    我只需要一种基于某些演员,导演等列出电影的方法。

    所以我不知道如何最好地实现这个目标?只是征求意见。

5 个答案:

答案 0 :(得分:2)

1。我喜欢公开ReadOnlyCollection<>以及AddXXX / RemoveXXX方法。您使用IList<> private为该集合播种;添加/删除方法修改内部列表,然后将其反映在外部只读列表中。

2。 DirectorActor是实体,这意味着它们会随着时间的推移而存在。它们可以在很多地方被引用,而不是在那些地方,类似于没有你在房间里的人可以如何与你交谈。使用string的多个实例通过将不同的实例与同一实体等同来打破这些类比。我可以改变我的名字,但我仍然是同一个人; string名称不适用。

3。由于DirectorActor之间没有区别,您可能只有Person,然后是名为{{1}的集合和Directors对象上的Actors

答案 1 :(得分:2)

如果你的XML中的actor和director列表的目的是识别actor / director,那么我将专注于形式的识别,而不是用什么类的层次结构来表示引用的身份。

例如,一个邮件列表 - 带有邮件列表,你不会专注于建筑物的类型,而是集中精力提出一个表格来确定位置。

这同样适用于此,特别是因为它听起来像你不是(也可能不应该)直接在你的电影元素中为你的演员/导演'人'宣告属性。

相反,它听起来像你在电影元素中真正想要的是一个可以用来交叉引用一个人的标识。

使用的身份证明形式取决于您,但用于包含此人姓名的字符串可能就足够了。当然,您可以选择无数其他选项......例如你可以使用一个'Name'结构,它被分成Forename,surname,middle initial组件,或者你可以使用一个唯一的整数ID(假设你使用这个ID来查找具有name属性等的Person对象。)。

以下是xml结构的示例,假设您要将人和电影存储在单个文档中:

<yourDocument>
   <movies>
      <movie id="Bladerunner">
         <actorRoles>
            <actorRole id="Rutger Hauer" character="Roy Batty"/>
            <actorRole id="Harrison Ford" charactor="Rick Deckard"/>
         </actorRoles>
         <directorRoles>
            <directorRole id="Ridley Scott" category="Principle"/>
            <directorRole id="Jordan Cronenweth" category="Cinematography"/>
         </directorRoles>
      </movie>
      <movie id="The Room">
         <actorRoles>
            <actorRole id="Rutger Hauer" character="Harry"/>
         </actorRoles>
         <directorRoles>
            <directorRole id="Rutger Hauer" category="codirector"/>
            <directorRole id="Erik Lieshout" category="codirector"/>
         </directorRoles>
      </movie>
   </movies>

   <persons>
      <person id="Ridley Scott">
         <nationality>English</nationality>
         <birth>11/30/1937</birth>
      </person>
      <person id="Harrison Ford">
         <nationality>American</nationality>
         <birth>7/13/1942</birth>
      </person>
      <person id="Rutger Hauer">
         <nationality>Dutch</nationality>
         <birth>1/23/1944</birth>
      </person>
      <person id="Jordan Cronenweth">
         <nationality>American</nationality>
         <birth>2/20/1935</birth>
      </person
   </persons>
</yourDocument>

明白我的意思?

你真正拥有的是使用id来交叉引用person对象的actor和director角色 - 你可以很容易地将名称属性添加到person对象并使用唯一的整数ID交叉引用你的Person对象你可以然后检索他们的名字和任何其他财产。 (使用唯一的不变整数ID也可以支持更新人名而不会对您的交叉引用造成问题)

由于演员和导演角色可能没有共同属性,我可能会避免使用“角色”的基类。

答案 2 :(得分:1)

同样,一个简单的String可能会为第一个实现做,但你可能会更好地使用以下类型:

class Person
{
    public int ID { get; set; }
    public string ForeName { get; set; }
    public string SurName { get; set; }
}

然后,您可以将ID存储在Movie类/表中,Person类可以扩展为“真实姓名”,“也称为”等等。这些只会在您想要将它们添加到您的应用程序时实现。

ID是添加此人时生成的唯一编号。如果您的应用程序使用数据库,那么您可以将Person表设置为自动为您生成此值。

这些List会有,但对于演员来说,你需要存储角色名和演员姓名。

答案 3 :(得分:1)

  1. 我肯定会看看内置类型List。它们内置了许多有用的功能,并且经过了很好的测试。
  2. 您应该为这些类型定义一个类型,因为这样可以使代码更清晰,并且可以方便将来的增强。
  3. 我看不到导演或演员的具体属性,他们只是人。所以我只需要一个Person类,即单独的Movie Class中的字段Diretor或Actor的类型。这也优雅地解决了同时扮演演员和导演的问题。
  4. PS:这看起来像是OO书籍中的第一个例子之一: - )

答案 4 :(得分:0)

我建议使用类型系统,Person并将ActorDirector作为子类型。这样你就可以在actor和director上拥有可以用作有用数据快捷方式的集合。类似的东西:

public class Actor : Person
{
    //Name and whatnot inherits from Person
    public List<Movie> PerformedIn
    {
        get
        {
            return myGlobalMovieList.Where(movie=>movie.Actors.Contains(this.Name));
        }
    }
}

这可以让你轻松获得一个演员在有演员后所有电影的列表,所以如果有人说,在你的应用中搜索汤姆克鲁斯,你可以加载“汤姆克鲁斯”演员对象,如果有人要点击“显示此演员的所有电影”按钮,您只需引用TomCruise.PerformedIn属性,然后就可以了!