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

时间:2017-08-29 08:24:35

标签: 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;}
} 

使用数组的另一个选项

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 Vs Array

在那之后,首先,我选择了第一个选项(我的回答是这个)并且相信,List具有更多功能,并且是更好的选择。另一个原因是,我在项目中使用EF,当与表格的关系专门用于一对多时,则创建的类具有List的集合,如下所示:

public List<Book> Books{ get; set;}

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

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

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

我的观点 - 一维意味着List是一维数组或相关的东西。

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

  • 它会进行大量的位移,所以byte []非常重要 用于编码;

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

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

1 个答案:

答案 0 :(得分:1)

正如链接首先说明的那样,您必须了解默认情况下,数组具有指定内存分配方式的特定大小。如果超过该分配,则必须担心再次将内存分配给整个阵列。

列表是动态的,这基本上意味着一个元素只会保持指向下一个元素的指针,所以很容易在任何地方(正面,背面,中间)添加新项目。主变量只保留指向第一个元素的指针,这样就可以将列表放在一起。

老实说,在你的例子中,我使用list版本只是因为它们可以根据需要进行扩展和收缩,而且它的内存效率更高。

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

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

回答你的问题: 1)数组是多维的,如int [,],可以用IList轻松实现&gt ;;这一切都是抽象的,我建议你研究链表类型(https://www.tutorialspoint.com/data_structures_algorithms/linked_list_algorithms.htm),也许这会回答几个问题 2)这非常特定于该应用程序,并且通常一些字节数组操作将默认返回字节数组,因为大小是可预测的,所以不确定你真正想要的是什么。

希望这有帮助。