C# 列表与数组:一对多和有一个关系

C# 列表与数组:一对多和有一个关系,c#,arrays,asp.net-mvc,list,one-to-many,C#,Arrays,Asp.net Mvc,List,One To Many,几天前,我面临一项测试,要求我回答以下问题:虽然这似乎很基本,但我有一些疑问和我自己的观点 出版中心出版书籍。一个作家可以写很多书,一本书有一个作者 有四个选项,其中我省略了两个不接近的选项。因此,剩下两个选项如下: 一个带有列表的选项: public class Publisher { public int PublisherId { get; set;} public string PublisherName { get; set;} public string Addre

几天前,我面临一项测试,要求我回答以下问题:虽然这似乎很基本,但我有一些疑问和我自己的观点

出版中心出版书籍。一个作家可以写很多书,一本书有一个作者

有四个选项,其中我省略了两个不接近的选项。因此,剩下两个选项如下:

一个带有列表的选项

public class Publisher
{
   public int PublisherId { get; set;}
   public string PublisherName { get; set;}
   public string Address { get; set;}
   public List<Author> Authors { get; set;}
   public List<Book> Books{ get; set;}
}   

public class Author
{
   public int AuthorId { get; set;}
   public string AuthorName { get; set;}
   public string AuthorAddress { get; set;}
   public List<Book> Books{ get; set;}
}   

public class Book
{
   public int BookId { get; set;}
   public string BookName { get; set;}
   public Author Author { get; set;}
} 
public class Publisher
{
   public int PublisherId { get; set;}
   public string PublisherName { get; set;}
   public string Address { get; set;}
   public Author[] Authors { get; set;}
   public Book[] Books{ get; set;}
}   

public class Author
{
   public int AuthorId { get; set;}
   public string AuthorName { get; set;}
   public string AuthorAddress { get; set;}
   public Book[] Books{ get; set;}
}   

public class Book
{
   public int BookId { get; set;}
   public string BookName { get; set;}
   public Author Author { get; set;}
} 
同时,我查看了此链接以了解差异:

基于此,首先,我选择了第一个选项(我的答案是这个),并相信,
List
具有更多功能,是一个更好的选择。另一个原因是,我在项目中使用EF,并且在处理与表的关系时,特别针对一对多,然后创建类,有一个
列表
的集合,如下所示:

public List<Book> Books{ get; set;}
public List book{get;set;}
其次,我在想,如果数组也可以用于相同的目的,但是我所学到的数组数据结构对于固定数据来说是完美的。我希望,我在正确的轨道上

最后,我无法从提供的链接中理解两件事:

public class Publisher
{
   public int PublisherId { get; set;}
   public string PublisherName { get; set;}
   public string Address { get; set;}
   public List<Author> Authors { get; set;}
   public List<Book> Books{ get; set;}
}   

public class Author
{
   public int AuthorId { get; set;}
   public string AuthorName { get; set;}
   public string AuthorAddress { get; set;}
   public List<Book> Books{ get; set;}
}   

public class Book
{
   public int BookId { get; set;}
   public string BookName { get; set;}
   public Author Author { get; set;}
} 
public class Publisher
{
   public int PublisherId { get; set;}
   public string PublisherName { get; set;}
   public string Address { get; set;}
   public Author[] Authors { get; set;}
   public Book[] Books{ get; set;}
}   

public class Author
{
   public int AuthorId { get; set;}
   public string AuthorName { get; set;}
   public string AuthorAddress { get; set;}
   public Book[] Books{ get; set;}
}   

public class Book
{
   public int BookId { get; set;}
   public string BookName { get; set;}
   public Author Author { get; set;}
} 
1) 作为计数器-
列表
是一维的;其中,有int[,]或string[,]等矩形(etc)数组,但在对象模型中有其他方法对此类数据进行建模(如果需要)

我的视图-一维的意思是
列表
一维数组或相关的东西

2) 有点困惑,我的意思是,在什么情况下,我们应该将以下内容与
数组一起使用?虽然它解释了,但需要进一步澄清:

  • 它会进行大量的位移位,因此字节[]非常重要 用于编码

  • 我使用一个本地滚动字节[]缓冲区,在发送到底层流(和v.v.)之前填充该缓冲区;比缓冲流快 等等,

  • 它在内部使用基于数组的对象模型(Foo[]而不是List),因为大小在构建后是固定的,需要 非常快

正如链接所说,首先,您必须了解,默认情况下,数组具有特定的大小,指示如何分配内存。如果超出该分配,您将不得不担心将内存再次分配给整个阵列

列表是动态的,这基本上意味着一个元素将只保留一个指向行中下一个元素的指针,因此很容易在任何位置(前面、后面、中间)添加新项目。主变量只保留指向第一个元素的指针,因此列表就是这样放在一起的

老实说,在您的示例中,我会使用列表版本,因为它们可以根据需要进行扩展和收缩,而且内存效率更高

另一方面,我宁愿使用IList甚至IEnumerable类型,这样您就可以在创建者生成新对象时打开具体的实现

当需要添加、删除等操作时,可以使用IList;当只需要枚举元素(即搜索、筛选)时,可以使用IEnumerable

回答您的问题: 1) 数组像int[,]一样是多维的,这可以通过IList>轻松实现;这都是抽象的,我建议您研究链表类型(),也许这会回答一些问题 2) 这是该应用程序特有的,通常一些字节数组操作会在默认情况下返回字节数组,同样,因为大小是可预测的,所以不确定您真正在寻找什么


希望这能有所帮助。

好吧,个人观点:除了数组/集合-问题之外,如果逐字逐句地分解需求,我认为这两种解决方案都是不正确的:提到了两个参与者:“作者”和“作者”。两者可能不一样。在出版环境中,我认为了解“鬼作家”并不太牵强。但如果这些是唯一合理的选择,那么我想我可能走得太远了。我想,作者和作者是同一个词。这似乎是混淆或混淆。考虑一本书可以有多个作者(或作家),是正确的基础关系逻辑构建?我认为一对多关系通常有
列表
作为其他表的参考。问题是什么?你给了我们一个关于问题的模糊概念,并详细说明了你对数组和列表的调查,但实际上你并没有问任何问题。你想知道什么?为了它的价值,这个测试似乎没有方向性和模糊性,但这不是测试回顾交换。我同意这一点,谢谢你的解释。我希望你能在最后回答接下来的两个问题。我已经编辑了答案,希望能为你澄清一些事情实际上,在内部使用数组,而不是链表。因此如果
list
在内部使用数组,那么
List
是一个一维数组还是多维数组?我是说数组是如何构造的@Pieter Witvoet?仅作澄清。@user8512043:数组可以是多维的,但这只在特定情况下有用-它根本不会影响您的用例。