c# - 列表与数组 : One-To-Many and Has-A Relationship

标签 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-as you have rectangular (etc) arrays like int[,] or string[,,] - 但是还有其他方法可以在对象模型中对此类数据进行建模(如果需要)

我的观点 - 一维均值是 List一维数组或相关的东西。

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

  • 它做了很多位移,所以一个 byte[] 非常重要 用于编码;

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

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

最佳答案

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

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

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

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

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

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

希望这对您有所帮助。

关于c# - 列表与数组 : One-To-Many and Has-A Relationship,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45934160/

相关文章:

c# - 如何在创建新文件夹或文件时触发 Windows 服务启动

c# - 从 C# 到 MySQL CakePhp 用户的身份验证

java - 在数组中重新分配值的简单方法

c# - 存储库模式 - 摘要信息

c# - Linq:创建一个列表,获取列表中每个节点的左右子节点

C# 从主类中调用带参数的方法

Java-使用递归展平数组

asp.net-mvc - MVC Controller 设计

asp.net-mvc - 在ajax请求中返回PDF

c# - Fluent Api - M :M relationship with two 1:M properties. 怎么样?