42

我想知道在构造函数中使用或不使用“hashset”创建类有什么区别。

使用代码优先方法(4.3)可以创建如下模型:

public class Blog
 {
     public int Id { get; set; }
     public string Title { get; set; }
     public string BloggerName { get; set;}
     public virtual ICollection<Post> Posts { get; set; }
  }

public class Post
 {
    public int Id { get; set; }
    public string Title { get; set; }
    public DateTime DateCreated { get; set; }
    public string Content { get; set; }
    public int BlogId { get; set; }
    public ICollection<Comment> Comments { get; set; }
 }

或者可以创建这样的模型:

public class Customer
{
    public Customer()
    {
        BrokerageAccounts = new HashSet<BrokerageAccount>();
    }
    public int Id { get; set; }
    public string FirstName { get; set; }
    public ICollection<BrokerageAccount> BrokerageAccounts { get; set; }
}

public class BrokerageAccount
{

    public int Id { get; set; }
    public string AccountNumber { get; set; }
    public int CustomerId { get; set; }

}

哈希集在这里做什么?

我也应该在前两个模型中使用 hashset 吗?

有没有文章显示hashset的应用?

4

3 回答 3

26

一般来说,最好使用最能表达您意图的集合。如果你不特别打算使用 HashSet 的独特特性,我不会使用它。

它是无序的,不支持按索引查找。此外,它不像其他集合那样适合顺序读取,而且它允许您多次添加相同的项目而不创建重复项这一事实只有在您有理由使用它时才有用。如果这不是您的意图,它可能会隐藏行为不端的代码并使问题难以隔离。

HashSet 在插入和删除时间非常重要的情况下非常有用,例如在处理数据时。它对于使用相交、除外和联合等操作比较数据集(再次在处理时)也非常有用。在任何其他情况下,缺点通常大于优点。

考虑到在处理博客文章时,与读取相比,插入和删除非常少见,而且您通常希望以特定顺序读取数据,无论如何。这或多或少与 HashSet 擅长的完全相反。非常怀疑您是否打算出于任何原因两次添加相同的帖子,而且我认为您没有理由对这样的课程中的帖子使用基于集合的操作。

于 2013-08-10T05:22:51.100 回答
26

HashSet 没有定义实际获取数据时将生成的集合类型。这将始终是声明的 ICollection 类型。

在构造函数中创建的 HashSet 是为了帮助您在没有获取记录或在关系的多方中不存在记录时避免 NullReferenceExceptions。这绝不是必需的。

例如,根据您的问题,当您尝试使用类似...的关系时

var myCollection = Blog.Posts();

如果没有 Posts 存在,那么myCollection将是null. 没关系,直到您流利地链接事物并执行类似的操作

var myCollectionCount = Blog.Posts.Count();

这将与NullReferenceException.

然而

var myCollection = Customer.BrokerageAccounts();
var myCollectionCount = Customer.BrokerageAccounts.Count();

将导致清空 ICollection 和零计数。没有例外 :-)

于 2014-07-30T12:18:07.443 回答
21

我对实体框架相当陌生,但这是我的理解。集合类型可以是实现的任何类型ICollection<T>。在我看来,HashSet 通常是语义正确的集合类型。大多数集合应该只有一个成员的一个实例(没有重复),而 HashSet 最好地表达了这一点。我一直在编写如下所示的课程,到目前为止效果很好。请注意,集合的类型为 asISet<T>而 setter 是私有的。

public class Customer
{
    public Customer()
    {
        BrokerageAccounts = new HashSet<BrokerageAccount>();
    }
    public int Id { get; set; }
    public string FirstName { get; set; }
    public ISet<BrokerageAccount> BrokerageAccounts { get; private set; }
}
于 2013-03-15T13:11:37.547 回答