2015-02-23 65 views
8

我的EF模型是這樣的:ASP.NET實體框架6 HashSet或列表集合?

public class ContentStatus 
{ 
    public ContentStatus() 
    { 
     this.Contents = new List<Content>(); 
    } 

    public int ContentStatusId { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Content> Contents { get; set; } 
} 

不過,我也看到implementatins看起來像這樣:

public class ContentStatus 
{ 
    public ContentStatus() 
    { 
     this.Contents = new HashSet<Content>(); 
    } 

    public int ContentStatusId { get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Content> Contents { get; set; } 
} 

這裏是DDL此對象:

CREATE TABLE [dbo].[ContentStatus] (
    [ContentStatusId] INT   NOT NULL, 
    [Name]   NVARCHAR (50) NOT NULL, 
    CONSTRAINT [PK_ContentStatus] PRIMARY KEY CLUSTERED ([ContentStatusId] ASC) 
); 

人告訴我應該使用哪一個,甚至是否存在差異,何時使用列表以及何時應用HashSet。

感謝

回答

0

所以一個HashSet<T>definition

而一個List<T>不具備這些功能。

所以我想它是下降到所需的特性和性能(小的集合可以忽略不計)。他們都可以被列舉。

性能(雖然可能很小的差異)將在讀和寫兩部分中顯而易見。正如Sean評論說,由於哈希碼計算和唯一性比較,可能會有處罰。但讀取速度非常快(o(1))。

所以真的,這一切都歸結爲所需的特徵。

在我的項目中,我會使用List<T>,但這是我的慣例。只要你堅持,你可以確定你自己的約定。

+0

'HashSet'可以迭代。任何實現IEnumerable的類都可以實現它,並且'List '和'HashSet '都可以實現。 – 2015-11-24 10:11:31

+0

@XavierPoinas更新了答案......上帝知道我從哪裏得到了這個想法...... – 2015-11-24 10:33:24

+0

我認爲Hashset對插入來說會更昂貴,因爲它確保唯一性,因此必須與其他條目或至少它們的哈希進行比較,但移除成本較低(假設散列查找項目比枚舉列表快)。 – 2017-03-21 16:27:47

5

這取決於您的用例,但在大多數情況下,您只能將項目添加到集合一次,因爲例如每個狀態僅適用於內容一次。我懷疑你可以讓一個內容在狀態中出現兩次。因此HashSet是正確的數據結構,因爲它可以防止重複。如果一個項目可以重複列表將是正確的,但我沒有遇到過這種情況,甚至不知道EF如何處理它。

作爲一個方面說明,我會建議您不要在實體中包含項目集合,除非您需要它。例如,如果您正在構建一個Web應用程序以列出產品,那麼您可能會看到顯示單個產品及其代碼的位置。因此,產品應該有一組標籤來簡化這個案例。但是,您可能沒有顯示帶有其產品集合的標籤的頁面,因此標籤不應具有產品屬性。它只是不關心相關產品。看起來這個Status實體並不關心它的內容集合。