列出Vs数组:一对多和有关系

use*_*043 5 c# arrays asp.net-mvc list one-to-many

几天前,我遇到了一个测试,我被要求回答以下问题:虽然看起来很基本,但我有一些疑问和我自己的看法

出版中心出版书籍.作家可以写很多书,书也有作者

有四个选项,其中,我省略了两个不接近的选项.所以留下两个选项如下:

列表的一个选项:

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;}
} 
Run Code Online (Sandbox Code Playgroud)

阵列的另一个选项:

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;}
} 
Run Code Online (Sandbox Code Playgroud)

同时,我查看了这个链接以了解其中的区别:List Vs Array

在此之后,首先,我选择了第一个选项(我的回答是这个)并且相信,它List具有更多功能并且将是更好的选择.另一个原因是,我在项目中使用EF,并且在与一对多的表的关系工作时,然后创建的类具有如下集合List:

public List<Book> Books{ get; set;}
Run Code Online (Sandbox Code Playgroud)

其次,我在想,如果数组可以用于相同的,但我学到的数组数据结构非常适合固定数据.我希望,我走在正确的轨道上.

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

1)作为反制 - List<T>是一维的; where - 因为你有像int [,]或string [,,]这样的矩形(等)数组 - 但是在对象模型中还有其他方法可以建模这些数据(如果需要)

我的观点 - 一维手段是List一维数组或相关的东西.

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

  • 它会进行大量的位移,因此byte []对编码非常重要;

  • 我使用一个本地滚动byte []缓冲区,在发送到底层流(和vv)之前我填充; 比BufferedStream等更快;

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

And*_*i U 1

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

列表是动态的,这基本上意味着一个元素只会保留指向行中下一个元素的指针,因此很容易在任何地方(前面、后面、中间)添加新项目。main 变量仅保留指向第一个元素的指针,这就是列表的组合方式。

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

顺便说一句,我宁愿使用 IList 甚至 IEnumerable 类型,这样您就可以在创建者生成新对象时保留要使用的具体实现。

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

回答您的问题: 1)数组是多维的,如 int[,] ,可以使用 IList> 轻松实现;这都是抽象的,我建议您研究链表类型(https://www.tutorialspoint.com/data_structs_algorithms/linked_list_algorithms.htm),也许这会回答一些问题2)这对于该应用程序来说是非常具体的,通常一些字节数组操作将默认返回字节数组,因为大小是可预测的,所以不确定您真正在寻找什么。

希望这可以帮助。